{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Chapter 1.6: Creating models from scratch\n",
    "***\n",
    "So far we have shown the basics to create geological models by importing data from an external source (in especial GeoModeller 3D). In this chapter, we will explore the option available in GemPy to create the data directly in GemPy or to modify existing one. In this respect we will delve into the pandas DataFrames that contain the necessary data.\n",
    "\n",
    "\n",
    "\n",
    "In this example we will make use of the library qgrid. From its documentation :\n",
    "\n",
    "> Qgrid is a Jupyter notebook widget which uses SlickGrid to render pandas DataFrames within a Jupyter notebook. This allows you to explore your DataFrames with intuitive scrolling, sorting, and filtering controls, as well as edit your DataFrames by double clicking cells.\n",
    "\n",
    "In practice these library allows us to use `pandas.DataFrames` in Jupyter Notebooks as an excel table. Be aware that `Qgrid` requires of enabling nbextensions so it is important to test that the installation (https://github.com/quantopian/qgrid) was successful before trying to execute the rest of the notebook.\n",
    "\n",
    "Let's create a bit of default data:\n",
    "\n",
    "Let's start as always by importing the necessary dependencies:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:47.256800Z",
     "start_time": "2020-04-15T10:42:45.542463Z"
    }
   },
   "outputs": [],
   "source": [
    "# Importing gempy\n",
    "import gempy as gp\n",
    "\n",
    "# Embedding matplotlib figures into the notebooks\n",
    "#%matplotlib inline\n",
    "\n",
    "\n",
    "# Aux imports\n",
    "import numpy as np\n",
    "import pandas as pn\n",
    "import matplotlib.pyplot as plt\n",
    "import theano\n",
    "import qgrid"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:47.768798Z",
     "start_time": "2020-04-15T10:42:47.260374Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Active grids: ['regular']\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>X</th>\n",
       "      <th>Y</th>\n",
       "      <th>Z</th>\n",
       "      <th>smooth</th>\n",
       "      <th>surface</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>400.0</td>\n",
       "      <td>300.0</td>\n",
       "      <td>-500.0</td>\n",
       "      <td>0.000001</td>\n",
       "      <td>surface1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>600.0</td>\n",
       "      <td>300.0</td>\n",
       "      <td>-500.0</td>\n",
       "      <td>0.000001</td>\n",
       "      <td>surface1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "       X      Y      Z    smooth   surface\n",
       "0  400.0  300.0 -500.0  0.000001  surface1\n",
       "1  600.0  300.0 -500.0  0.000001  surface1"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "geo_model = gp.create_model('Tutorial_ch1-6_CreatingModels')\n",
    "gp.init_data(geo_model, [0, 1000, 0, 1000, -1000, 0], [50, 50, 50])\n",
    "geo_model.set_default_surfaces()\n",
    "geo_model.set_default_orientation()\n",
    "geo_model.add_surface_points(400, 300, -500, 'surface1')\n",
    "geo_model.add_surface_points(600, 300, -500, 'surface1')\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Some default values but to make the model a bit faster but they are not necessary:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:58.363950Z",
     "start_time": "2020-04-15T10:42:47.769798Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Setting kriging parameters to their default values.\n",
      "Compiling theano function...\n",
      "Level of Optimization:  fast_run\n",
      "Device:  cpu\n",
      "Precision:  float64\n",
      "Number of faults:  0\n",
      "Compilation Done!\n",
      "Kriging values: \n",
      "                   values\n",
      "range            1732.05\n",
      "$C_o$            71428.6\n",
      "drift equations      [3]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<gempy.core.interpolator.InterpolatorModel at 0x257f226ceb8>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gp.set_interpolator(geo_model, theano_optimizer='fast_run',  verbose=[])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:58.379951Z",
     "start_time": "2020-04-15T10:42:58.364950Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th>values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"9\" valign=\"top\">Structure</th>\n",
       "      <th>isLith</th>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>isFault</th>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>number faults</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>number surfaces</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>number series</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>number surfaces per series</th>\n",
       "      <td>[1]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>len surfaces surface_points</th>\n",
       "      <td>[2]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>len series surface_points</th>\n",
       "      <td>[2]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>len series orientations</th>\n",
       "      <td>[1]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"5\" valign=\"top\">Options</th>\n",
       "      <th>dtype</th>\n",
       "      <td>float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>output</th>\n",
       "      <td>geology</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>theano_optimizer</th>\n",
       "      <td>fast_run</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>device</th>\n",
       "      <td>cpu</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>verbosity</th>\n",
       "      <td>[]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">Kriging</th>\n",
       "      <th>range</th>\n",
       "      <td>1732.05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>$C_o$</th>\n",
       "      <td>71428.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>drift equations</th>\n",
       "      <td>[3]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">Rescaling</th>\n",
       "      <th>rescaling factor</th>\n",
       "      <td>1200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>centers</th>\n",
       "      <td>[300.000005, 150.000005, -249.999995]</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "                                                                      values\n",
       "Structure isLith                                                        True\n",
       "          isFault                                                      False\n",
       "          number faults                                                    0\n",
       "          number surfaces                                                  1\n",
       "          number series                                                    1\n",
       "          number surfaces per series                                     [1]\n",
       "          len surfaces surface_points                                    [2]\n",
       "          len series surface_points                                      [2]\n",
       "          len series orientations                                        [1]\n",
       "Options   dtype                                                      float64\n",
       "          output                                                     geology\n",
       "          theano_optimizer                                          fast_run\n",
       "          device                                                         cpu\n",
       "          verbosity                                                       []\n",
       "Kriging   range                                                      1732.05\n",
       "          $C_o$                                                      71428.6\n",
       "          drift equations                                                [3]\n",
       "Rescaling rescaling factor                                              1200\n",
       "          centers                      [300.000005, 150.000005, -249.999995]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "geo_model.additional_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:58.521950Z",
     "start_time": "2020-04-15T10:42:58.380952Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\n",
       "Lithology ids \n",
       "  [2. 2. 2. ... 1. 1. 1.] "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gp.compute_model(geo_model, debug=False,compute_mesh=False, sort_surfaces=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:58.658951Z",
     "start_time": "2020-04-15T10:42:58.522951Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "i:\\pycharmprojects\\gempy\\gempy\\plot\\plot_api.py:261: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  p.fig.show()\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<gempy.plot.visualization_2d.Plot2D at 0x25797fbb2e8>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfQAAAHqCAYAAADyCrxhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdeVhU9eLH8Q+rbIqAO+ICGGpmkghJdTHJtNyy1LquaZaa5oY3vZamZlpqbhi0et2zXKI0KwqXNEo028gdUEESQdzQwWGZ3x9e5xfXtQIGT+/X8/g8cb4z53zPwXxzzpkZ7CwWi0UAAOCWZm/rCQAAgL+OoAMAYAAEHQAAAyDoAAAYAEEHAMAACDoAAAZA0GEYRUVFWrFihXr27KmQkBC1atVK//znP7Vx48Y/vK6goCC9//77kqTo6Gjdc88913xsdHS0goKCtH79+ivGMjIyFBQUpK+//voPz+GP6Nu3r0aPHl2m27ie3bt3q1+/fmrVqpXuuecejRw5UseOHbOOFxcXq0WLFgoKCirx53pzHj9+fInHNmnSRC1btlSfPn20ZcuWEo+90feotBw6dEhfffWV9WtbH3fg9xxtPQGgNJjNZj311FM6evSohg8frrvuuksWi0VffPGFxo4dqwMHDmjUqFFlOoeXX35ZYWFhqlGjRplup6JJSUnRwIED1bVrV7300ks6f/68Zs6cqYEDByouLk6urq46cuSITCaTVq1apbp161qf6+Lict1133777XrrrbckXfqBLScnRx999JGGDBmiGTNmqFu3bpKkgQMHqnfv3mW3k//1zDPP6OGHH9YDDzwg6dIPEg4ODmW+XeBmEHQYwvz58/Xrr79q/fr18vX1tS4PDAyUvb29FixYoM6dOysgIKBMtu/u7i4HBwe9+OKLevvtt8tkGxXVmjVrVLNmTU2ePFl2dnaSpFmzZqlNmzZKSkpSRESE9u/fL2dnZzVv3vwPBdDR0VHVq1e3fl2rVi01a9ZMFy9e1CuvvKK2bdvK09NT7u7ucnd3L/V9u5GqVauW+zaBa+GSO255BQUFWrNmjbp3714i5pf169dPS5YsKXFm+NFHH6ljx46644471L59ey1cuFBms/lPz8HV1VVTp07V1q1btXr16ms+bt26dQoKCtLFixety3bs2KGgoCClpKRIunQZd+bMmZoyZYpatmypsLAwzZs3T0ePHtXAgQN15513qm3btvrkk09KrNtkMunf//63goODdffdd2v27NkqKCiwjufl5WnSpEkKDw9XcHCwnnjiCX377bcl5vaPf/xDs2bNUqtWrfTEE0/IYrGob9++6tu37zX36bHHHtNrr71mjbkk63+fOXNGkrR//341aNCg1M5mn3rqKZ07d06bN2+WdOUl96CgIM2bN08PPPCA7r77bv3www+Sbvx9N5lMevXVV/WPf/xDd955px577DF98803kqS2bdvq2LFjeuedd9S2bVtJV15yP3TokIYNG6a7775bwcHBGjRokPbt22cdHz9+vKKiojRnzhzde++9atmypQYOHKjU1FTrYy7fwrmWbt26aeTIkSWWHT58WEFBQfr555//8LGEcRB03PLS09N1+vRpBQcHX3Xc3d1doaGhqlSpkiTpgw8+0Msvv6ynn35aGzdu1IQJExQXF6fx48f/pXm0a9dOnTt31quvvqrMzMy/tK6lS5fK29tbcXFx6tevn2JjY9W/f3899thjWrdunYKDg/XCCy/o9OnT1uds3rxZTk5OWrNmjaZNm6a1a9dqxowZkiSLxaJBgwbp4MGDio6O1rp169S2bVsNGjRIW7duta4jKytLKSkpWrt2rfWMOzo6WtHR0deca2BgoFq0aFFiWWxsrCpVqqTWrVtLuhR0e3t7DRkyRPfcc4+6dOmixYsXq6io6E8dn4YNG8rFxUX79++/5mNWrFihWbNm6a233tIdd9xxU9/3qKgoff7555o8ebLWr1+v1q1ba/DgwTp48KDWrFmjWrVqqU+fPlqzZs0V2zt27JieeOIJFRYW6r333tPKlSvl5OSk3r17Kz093fq4L774QpmZmfrPf/6jmJgYpaamavLkydbxgQMHavv27dfcr+7du2vTpk06e/asddm6det02223qXnz5jd7CGFABB23vMtngZ6enjf1+JiYGA0aNEiPPPKI/Pz8FBERoYkTJ+rTTz9VRkbGX5rLpEmT5O7urgkTJuiv/JqEBg0a6LnnnpOfn58GDBgg6dIPDB07dlRAQIAGDhwos9msw4cPW5/TqFEjTZ48WQEBAXrggQc0atQoffjhh8rLy9N3332nH374QXPnzlXLli3VsGFDPfPMM2rXrp3efffdEtt+9tlnVa9ePTVu3FjSpcvKf+TS8jvvvKNVq1Zp7Nix1svlBw4c0KlTp9S9e3e999576tGjh+bPn6+5c+f+6WNUpUoVnTt37prjHTt2VHBwsO688045Ojre8Pt++PBhJSQk6MUXX1Tbtm1Vr149jR07VgMGDFBeXp68vb3l4OAgV1dXeXt7X7G9ywGfO3eubr/9djVp0kRz586Vq6urlixZYn2ci4uLpk+frkaNGiksLEy9evXS7t27rePu7u4lbjP8ry5dusjBwcH6Ys/i4mLFxcWpe/fuf+YwwkC4h45b3uV/XH9/tnotubm5On78uGJjY/XOO+9Yl1+Ob0pKSolL839UlSpVNG3aND399NNasWKF2rRp86fW07BhQ+t/u7m5SZLq169vXXb5xWS/v3QfHBwse/v//xn9zjvvVEFBgVJSUvTrr79Kkh566KES2ykoKFCVKlVKLPv9dv6IoqIizZgxQ8uWLdOIESPUr18/69iGDRtUVFRkvc/duHFjmUwmLViwQCNHjpSTk9Mf3l5eXp4qV658zfEGDRpY//tmvu8mk0mSrrjaEBUVdVPz2b9/v5o2bWr9fkmXvk/NmzcvcSWhbt26cnZ2tn5duXLlErdGbqRy5cpq37694uLi9MQTT2jbtm3Kzc1Vly5dbnodMCaCjluen5+fqlWrph9++EEPP/zwFeN5eXl69tlnNWjQIDVt2lSSNHbs2KvG9npnRjfrH//4h3r27KnZs2fL39+/xNjv7zNfVlhYeMUyR8cr/9f8fayv5n/Hi4uLresvLi6Ws7Oz4uLibvi8G73y/GrOnz+v0aNH65tvvtG0adPUo0ePG67ztttuU0FBgXJzc1WzZs0/tL3U1FRduHBBt99++zUfc/kWi/T/x+J63/ffv56gNF0+9pf9/r//rB49eqh37946cuSI4uLi9MADD8jLy+svrxe3Ni6545Znb2+v7t27a+3atfrtt9+uGF++fLl27NghX19f+fj4yMfHR0ePHlX9+vWtfzIzMzVz5kxduHChVOY0fvx4+fj46KWXXiqx/PKZaF5ennXZkSNHSmWbl8/CL9u5c6ecnJzUqFEjBQUFyWw269y5cyX2e/Xq1froo4/+0nbNZrMGDx6snTt3KjY29oqYnz59WmFhYdb39V/2888/q2rVqn/qbX5Lly6Vp6en7r///pt6/M183wMDA63z+r0ePXrc1DsXgoKC9Ouvv5b4O5Sfn6/k5GTruktLSEiI/P399fHHH2vLli1cbockgg6DGDp0qAIDA/XEE09o3bp1OnLkiPbu3atZs2Zp/vz5GjVqlAICAmRnZ6dnnnlGq1at0qJFi3TkyBFt27ZN48ePl8lkUrVq1UplPu7u7poxY0aJF0NJly6D29vba/78+UpPT9fWrVu1aNGiUtnmr7/+qmnTpiklJUUbN27UwoUL1atXL1WpUkX33nuvbr/9dkVFRWn79u1KT09XTEyM3n333RKXpq/m9OnT172d8cYbb2jnzp2aOnWqmjRpouzsbOuf/Px8Va1aVWFhYVqwYIESEhJ09OhRrVy5Uu+++65Gjhx51asWlxUWFlrXlZWVpV9++UWTJk3SBx98oIkTJ970W9Vu5vtev359dejQQa+88oq2bdumI0eOaObMmTpw4ID1Bwd3d3cdOXJEWVlZV2yjV69eKiws1JgxY7Rnzx7t3btXY8aM0fnz59WrV6+bmqd06WpHdnb2DR/Xo0cPvffee6patarCw8Nvev0wLi65wxBcXFy0dOlSLV68WP/5z380bdo0OTo6qlGjRpo/f74efPBB62OffPJJubq6aunSpZozZ46qVq2qBx98UGPGjCnVOYWGhlrfMneZn5+fpk6dqjfffFPr1q3T7bffrokTJ+qZZ575y9vr1q2bTp48qUcffVSVK1dWnz59NHz4cEmSg4OD3nvvPc2ePVv/+te/dP78edWvX18zZ8684b3X5557TpK0bNmyq45fPsMfO3bsFWOTJ0/WP//5T7366qtauHChpk2bpuzsbNWrV08vvviievbsed1t//rrr7r33nslXboNUa1aNTVr1kxLlixRaGjo9Q/I/7iZ7/srr7yi119/XePGjdOFCxfUuHFjvfPOO2rUqJGkS69Anz59urp06WJ9O9tlvr6+Wr58uWbNmqXevXvLzs5OISEhev/99//Q6xIWLVqkhQsXXvcV/JL0yCOPaPbs2Xr00UdveDsGfw92lr/yUlwAgE3s27dP3bp1U0JCgurUqWPr6aAC4AwdAG4hqampOnDggBYtWqR27doRc1gZ/jrNnj171L17d7Vo0UJdu3bVjz/+aOspAcCflp6ervHjx8ve3l4TJ0609XRQgRj6kvvFixfVrl07DRkyRD169NDHH3+sefPmadOmTaXy1hEAACoKQ5+hf/fdd7K3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OnXqZOnUqZPl22+/tezbt88SERHBMbxJ33//veXxxx+3fv3ll19avvnmG0tKSorloYcesnz66afWMY7j1a1fv97y3HPPWb9+/vnnLevXr7ekpaVZOnTowDH8gzZv3my5++67LcOGDbN069bNMnjwYEtiYqIlLS3NEhISYvnll19KPP7555+3TJgwwWKxWCw7d+60PP3005bHH3/cMmrUKEteXt4f2jbvQ78OLhtdXdWqVa1vpygoKJCjo6OcnZ1Vp04dPf7445o+fbrat28vZ2dn1ahRQxaLpcQ9tVq1atlq6hWGnZ2dLBaLUlNTNWnSJK1du1arVq3SlClT9NRTT3EMb5K9vb3S09N14sQJjRs3TidOnJC7u7s8PT3l5eWl2bNn64EHHuA4XkeNGjUUHx+vV199VfHx8Tp37pxSU1NVpUoVeXt7cwz/oKSkJPXs2VOjR49Wbm6uVq5cqYULFyomJkaRkZGaM2eOYmJi5OLiouLiYjVt2lQ//fSTzp8/r5CQELVo0UImk4kPlkH5CA0NVb169SRJTk5O+v777+Xq6qq7775b9913n7Zt26a+ffsqIiJCP/30kySpcePGtpxyhWP574dvnD9/XmfOnNFzzz2n/v37a/369bK3t1eVKlX05JNP6t577+UYXke9evV01113adq0aWrZsqWGDx+uvLw8xcTEKDs7W7/99psGDhyo1q1b6+eff5bEcfxfoaGhGj9+vD755BO1adNGkyZN0qlTp/TGG2/o1KlTHMMbOHXqlL766iv16NFDZ8+e1e7du9WrVy9Jkre3tx566CEdPnxYCxYs0MSJExUZGakNGzYoMjJSXl5eysnJUbVq1eTu7i5JcnR0/NOv2eIUFH9Y5cqV1ahRI+vX69atU7NmzayfQRwdHa3evXvrxIkTCgoK0urVq+Xj42Or6VZIl++JpaSkqFmzZvL19ZWnp6emTZumkydPas2aNXr88cd1/PhxNW7cmGN4DZ6enmrUqJE2bdqkOnXqSJI8PDx033336dixY5o/f7569uyprKwsjuN1XP7h8ZFHHpEkeXl5KTIyUsePH9fChQs5htfx008/aeLEiUpPT1eVKlXk4+OjL774wjoeEBCgdu3a6ddff1V2drYmTZqkjz/+WKNHj9aECRP04YcfKjw8vFTmwhk6/jSLxaLs7Gxt375db7/9tiRp5cqV+vbbbzVhwgR17tyZ96PeQKNGjTRv3jwlJSWpQYMGql+/vqpUqSJXV1d17dpVnTp1koODg62nWWE5ODioW7du2rp1q7755hs9+uijkqSgoCCdOnVKVatWVZcuXdSxY0eO4w1cuHBBn332mZo3by7p0rt+zp07J29vb47hVVgsFhUVFWnNmjWqVKmSpk2bprfeekuDBg3SoEGDtGfPHjVt2lSSdMcdd8jPz0+//PKLOnfurKCgICUlJenEiRP69NNPVa1atVKZE0HHn2ZnZ6f09HQ1b95cZ8+eVc+ePZWTk6OpU6eqdu3atp5ehWexWLRnzx4VFxfrpZdeUkREhD788ENt27ZN3bt3t364Ea7Pz89PQ4cO1fPPP6+RI0fqvvvu04oVK3THHXeoRo0aksRxvAmBgYFatGiRnJycFBwcrOjoaIWEhFhjwzEsyc7OTnv37lVGRoZmzJih6dOna+vWrYqIiFBkZKSmTp2qVatWqbi4WHXq1FFaWpr1g2MCAgKsH8pTqnOyWPiMPvx577//vqZMmSJvb28NGDBATz/9tK2ndEs5c+aM9cM48NckJiYqMTFRhw4dUuvWrdW/f39bT+mWYjab9eGHH+q7777Tb7/9pk6dOmnAgAG2nlaFtmvXLp04cUIPP/ywZs6cqW3btmn9+vXKyspSp06d1Lt3bz3++OOqVKmSnnvuOY0aNUqtWrUqs/kQdPwlCQkJ2rdvn55++mk5Ozvbejq3rMLCQjk6OvKbqkoBx/CvKSgokL29PWfkN+H3f9cOHz6soUOH6tFHH9XTTz+t7du365133pHZbNaRI0fUqVMnTZgwoUznQ9Dxl/CPJwBc+rjbDz/8UDExMdqwYYOqVKmiCxcu6OjRo/Lx8VH16tXLfA4EHQCAUpCbm6tnn31W1atXV3R0dLlvnxfFAQBQCry9vTVixAhlZ2fbZPucoQMAYAB8sAwAAAZA0AEAMACCDgCAARB0AAAMgKADAGAABP3/2rtDVuWhOI7jPy4MsdnEYjNatBt8AxsKpoV1EZMIVmGIxcEE65JGgy9g70AwDlGTvgCDoA582uXeqBeewfb9xJP+ZXw558AOAAApQNABvG2/36tarX6/svdTv99Xq9XS8/lMYDIguwg6gLdVKhV1u135vq/D4fC9vl6vFYahptOpDMNIcEIge/ixDICPxHGsTqcjwzC0Wq10uVxkmqZ6vZ4cx0l6PCBzCDqAj0VRpHa7rcFgoDAM9Xq9FAQBD/YACSDoAP5kPp9rsVgon89rs9moVColPRKQSdyhA/iTZrOpOI5VLpdVLBaTHgfILIIO4GOPx0Oj0Uj1el1RFCkIgqRHAjKLoAP4mO/7Op/Pms1mchxHnufpdDolPRaQSdyhA/jIdruVbdtyXVeWZel+v8s0TRUKBS2XS319sV8A/ie+OABvu91uGg6HajQasixLkpTL5eS6rna7HUfvQAIIOoC3TSYTXa9XjcfjX+u1Wk22bcvzPB2Px4SmA7KJI3cAAFKAHToAAClA0AEASAGCDgBAChB0AABSgKADAJACBB0AgBQg6AAApABBBwAgBQg6AAAp8A+HvkJAh1/sjAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 748.8x514.8 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "gp.plot_2d(geo_model, cell_number=25,\n",
    "           direction='y', show_data=True)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:58.789950Z",
     "start_time": "2020-04-15T10:42:58.659950Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<gempy.plot.visualization_2d.Plot2D at 0x257976ee860>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfQAAAHqCAYAAADyCrxhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdfXzN9f/H8ec5Z5tdmI25nqvZxCSRoemCFlFECtUUkULIxXxLilRSUa7GFqVvQl8VGsq3ViMRGelqlMthI2zmcjvb2c4+vz98nV/LtTZnPj3ut9vK+bw/F6/3+4zn+bw/n3OOxTAMQwAA4JpmdXcBAADg7yPQAQAwAQIdAAATINABADABAh0AABMg0AEAMAECHabhdDq1YMEC9ejRQxEREWrevLkefvhhrVix4rL3Vb9+ff3nP/+RJMXGxuqWW24577qxsbGqX7++li9fflZbenq66tevr2+//faya7gcjz76qIYPH16ix7iQzZs3q1evXmrevLluueUWDR06VPv373e1FxYWqkmTJqpfv36RnwvVPGrUqCLrhoeHq1mzZnrkkUf0zTffFFn3Ys9Rcdm5c6e+/vpr12N3jzvwZx7uLgAoDg6HQ48//rj27dunwYMH66abbpJhGPryyy81cuRIbd++XcOGDSvRGl555RW1bNlSlStXLtHjlDa7du1S37591aVLF7344ovKzs7WxIkT1bdvXyUkJMjHx0d79+6V3W7XwoULVaNGDde23t7eF9z39ddfr1mzZkk6/YItMzNTn376qQYMGKDXXntNXbt2lST17dtXPXv2LLlO/s+TTz6pe+65R23btpV0+oWEzWYr8eMCl4JAhylMmzZNW7Zs0fLlyxUcHOxaHhYWJqvVqunTp+vee+9VaGhoiRzfz89PNptNL7zwgmbPnl0ixyitFi1apCpVqmjcuHGyWCySpEmTJqlNmzZKTk5W69attW3bNnl5ealx48aXFYAeHh6qVKmS63HVqlXVqFEj5eXl6dVXX1VUVJQCAgLk5+cnPz+/Yu/bxQQGBl71YwLnw5Q7rnn5+flatGiRunXrViTMz+jVq5fmzp1b5Mzw008/VceOHXXDDTeoffv2mjFjhhwOxxXX4OPjo5dfflmrV6/WJ598ct71lixZovr16ysvL8+1bMOGDapfv7527dol6fQ07sSJE/XSSy+pWbNmatmypaZOnap9+/apb9++uvHGGxUVFaVly5YV2bfdbtdzzz2npk2b6uabb9abb76p/Px8V/upU6c0duxYtWrVSk2bNtVDDz2k9evXF6nt9ttv16RJk9S8eXM99NBDMgxDjz76qB599NHz9umBBx7QG2+84QpzSa4/Hz9+XJK0bds21alTp9jOZh9//HGdPHlSq1atknT2lHv9+vU1depUtW3bVjfffLN+/PFHSRd/3u12u15//XXdfvvtuvHGG/XAAw/ou+++kyRFRUVp//79eueddxQVFSXp7Cn3nTt3atCgQbr55pvVtGlT9evXT7///rurfdSoUYqJidHkyZN16623qlmzZurbt692797tWufMJZzz6dq1q4YOHVpk2Z49e1S/fn398ssvlz2WMA8CHde8tLQ0HTt2TE2bNj1nu5+fn1q0aKEyZcpIkj766CO98soreuKJJ7RixQqNHj1aCQkJGjVq1N+qo127drr33nv1+uuv68CBA39rXx988IEqVKighIQE9erVS/Hx8erdu7ceeOABLVmyRE2bNtXzzz+vY8eOubZZtWqVPD09tWjRIo0fP16LFy/Wa6+9JkkyDEP9+vXTjh07FBsbqyVLligqKkr9+vXT6tWrXfs4dOiQdu3apcWLF7vOuGNjYxUbG3veWsPCwtSkSZMiy+Lj41WmTBlFRkZKOh3oVqtVAwYM0C233KLOnTvr/fffl9PpvKLxCQkJkbe3t7Zt23bedRYsWKBJkyZp1qxZuuGGGy7peY+JidEXX3yhcePGafny5YqMjFT//v21Y8cOLVq0SFWrVtUjjzyiRYsWnXW8/fv366GHHlJBQYHmzJmjDz/8UJ6enurZs6fS0tJc63355Zc6cOCA/v3vfysuLk67d+/WuHHjXO19+/bV2rVrz9uvbt26aeXKlTpx4oRr2ZIlS3TdddepcePGlzqEMCECHde8M2eBAQEBl7R+XFyc+vXrp/vuu081a9ZU69atNWbMGH3++edKT0//W7WMHTtWfn5+Gj16tP7O1yTUqVNHQ4YMUc2aNdWnTx9Jp18wdOzYUaGhoerbt68cDof27Nnj2qZevXoaN26cQkND1bZtWw0bNkwff/yxTp06pe+//14//vijpkyZombNmikkJERPPvmk2rVrp3fffbfIsZ966inVqlVLDRo0kHR6WvlyppbfeecdLVy4UCNHjnRNl2/fvl1Hjx5Vt27dNGfOHHXv3l3Tpk3TlClTrniMypUrp5MnT563vWPHjmratKluvPFGeXh4XPR537Nnj5KSkvTCCy8oKipKtWrV0siRI9WnTx+dOnVKFSpUkM1mk4+PjypUqHDW8c4E+JQpU3T99dcrPDxcU6ZMkY+Pj+bOnetaz9vbWxMmTFC9evXUsmVLRUdHa/Pmza52Pz+/IpcZ/qpz586y2Wyumz0LCwuVkJCgbt26XckwwkS4ho5r3pl/XP98tno+WVlZOnjwoOLj4/XOO++4lp8J3127dhWZmr9c5cqV0/jx4/XEE09owYIFatOmzRXtJyQkxPVnX19fSVLt2rVdy87cTPbnqfumTZvKav3/1+g33nij8vPztWvXLm3ZskWSdPfddxc5Tn5+vsqVK1dk2Z+PczmcTqdee+01zZs3T08//bR69erlavvss8/kdDpd17kbNGggu92u6dOna+jQofL09Lzs4506dUr+/v7nba9Tp47rz5fyvNvtdkk6a7YhJibmkurZtm2bGjZs6Hq+pNPPU+PGjYvMJNSoUUNeXl6ux/7+/kUujVyMv7+/2rdvr4SEBD300ENas2aNsrKy1Llz50veB8yJQMc1r2bNmqpYsaJ+/PFH3XPPPWe1nzp1Sk899ZT69eunhg0bSpJGjhx5zrC90JnRpbr99tvVo0cPvfnmm6pbt26Rtj9fZz6joKDgrGUeHmf/1fxzWJ/LX9sLCwtd+y8sLJSXl5cSEhIuut3F7jw/l+zsbA0fPlzfffedxo8fr+7du190n9ddd53y8/OVlZWlKlWqXNbxdu/erZycHF1//fXnXefMJRbp/8fiQs/7n+8nKE5nxv6MP//5SnXv3l09e/bU3r17lZCQoLZt26p8+fJ/e7+4tjHljmue1WpVt27dtHjxYv3xxx9ntc+fP18bNmxQcHCwgoKCFBQUpH379ql27dqunwMHDmjixInKyckplppGjRqloKAgvfjii0WWnzkTPXXqlGvZ3r17i+WYZ87Cz9i4caM8PT1Vr1491a9fXw6HQydPnizS708++USffvrp3zquw+FQ//79tXHjRsXHx58V5seOHVPLli1d7+s/45dfflFgYOAVvc3vgw8+UEBAgO64445LWv9SnvewsDBXXX/WvXv3S3rnQv369bVly5Yiv0O5ublKSUlx7bu4REREqG7dulq6dKm++eYbptshiUCHSQwcOFBhYWF66KGHtGTJEu3du1e//fabJk2apGnTpmnYsGEKDQ2VxWLRk08+qYULF+q9997T3r17tWbNGo0aNUp2u10VK1Yslnr8/Pz02muvFbkZSjo9DW61WjVt2jSlpaVp9erVeu+994rlmFu2bNH48eO1a9curVixQjNmzFB0dLTKlSunW2+9Vddff71iYmK0du1apaWlKS4uTu+++26RqelzOXbs2AUvZ8ycOVMbN27Uyy+/rPDwcGVkZLh+cnNzFRgYqJYtW2r69OlKSkrSvn379OGHH+rdd9/V0KFDzzlrcUZBQYFrX4cOHdKvv/6qsWPH6qOPPtKYMWMu+a1ql/K8165dWx06dNCrr76qNWvWaO/evZo4caK2b9/ueuHg5+envXv36tChQ2cdIzo6WgUFBRoxYoS2bt2q3377TSNGjFB2draio6MvqU7p9GxHRkbGRdfr3r275syZo8DAQLVq1eqS9w/zYsodpuDt7a0PPvhA77//vv79739r/Pjx8vDwUL169TRt2jTdddddrnUfe+wx+fj46IMPPtDkyZMVGBiou+66SyNGjCjWmlq0aOF6y9wZNWvW1Msvv6y3335bS5Ys0fXXX68xY8boySef/NvH69q1q44cOaL7779f/v7+euSRRzR48GBJks1m05w5c/Tmm2/qX//6l7Kzs1W7dm1NnDjxotdehwwZIkmaN2/eOdvPnOGPHDnyrLZx48bp4Ycf1uuvv64ZM2Zo/PjxysjIUK1atfTCCy+oR48eFzz2li1bdOutt0o6fRmiYsWKatSokebOnasWLVpceED+4lKe91dffVVvvfWWnn32WeXk5KhBgwZ65513VK9ePUmn70CfMGGCOnfu7Ho72xnBwcGaP3++Jk2apJ49e8pisSgiIkL/+c9/Luu+hPfee08zZsy44B38knTffffpzTff1P3333/RyzH4Z7AYf+dWXACAW/z+++/q2rWrkpKSVL16dXeXg1KAM3QAuIbs3r1b27dv13vvvad27doR5nAx/TzN1q1b1a1bNzVp0kRdunTRTz/95O6SAOCKpaWladSoUbJarRozZoy7y0EpYuop97y8PLVr104DBgxQ9+7dtXTpUk2dOlUrV64slreOAABQWpj6DP3777+X1WpVdHS0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mKgXX3xRERERV3THoZnt27dPvXr10tNPP62BAwdq3bp1+uWXX+Tt7e1a55ZbblFERIRmzpypvn37KjAwUNOnT9fq1at16NAh7dixQ3Xr1pWkS/6FNZuVK1eqW7duSk1NlYeHh7Zt21bklThjeHFpaWl6+OGHNWDAAPXs2VO///67tmzZUmQ8GMcL27t3r3r16qVhw4Zp6NChyszM1M6dOxnDYpSamqqAgABVqVJFjRo10pAhQ1ShQgWNHz9effv21b59+/TNN9/I6XRKOv15KI0aNZLT6bzkSxhMuf9FSEiI6tWrp3379unrr79Wx44d9dRTT7m7rFLlwIEDGjhwoFq2bKkXX3xRmzZtUmZmpgoKCvT999+rW7dukk5PwxUWFmrTpk2qV6+e2rdvr507d2rFihWaO3eu7rjjDvXt29fNvXGvzZs367PPPlP58uXVqlUrZWRkaMmSJXrwwQclMYYXk52dreHDh6thw4aaMmWKDMNQmzZtdODAAS1btoxxvATp6el66qmnFBERoWeffVaTJk1S1apVVa1aNS1evJgxvALZ2dmaO3euDh06pGrVqsnLy0vr16+Xw+FQZGSkvLy85OnpqYYNG2rs2LF67LHHFBAQoJUrV2rDhg0KDw/XtGnT5OPjo/vvv//SL2EYOC+n0+nuEkqlRYsWGf369XM9PnLkiHHbbbcZCxcuNO68805j2bJlrrZDhw4Z3bt3N9atW+da9scffxgnT568qjWXNoWFhYZhGMbChQuNTp06GZ06dTLWr19v/P7770br1q0Zw0v0ww8/GA8++KDr8VdffWV89913xq5du4y7777b+Pzzz11tjOO5LV++3BgyZIjr8TPPPGMsX77cSE1NNTp06MAYXqZVq1YZN998szFo0CCja9euRv/+/Y1169YZqampRkREhPHrr78WWf+ZZ54xRo8ebRiGYWzcuNF44oknjAcffNAYNmyYcerUqcs6Nu9DvwCmjc4tMDDQ9XaK/Px8eXh4yMvLS9WrV9eDDz6oCRMmqH379vLy8lLlypVlGEaRa2pVq1Z1V+mlhsVikWEY2r17t8aOHavFixdr4cKFeumll/T4448zhpfIarUqLS1Nhw8f1rPPPqvDhw/Lz89PAQEBKl++vN588021bduWcbyAypUrKzExUa+//roSExN18uRJ7d69W+XKlVOFChUYw8uU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\n",
      "text/plain": [
       "<Figure size 748.8x514.8 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "gp.plot_2d(geo_model, cell_number= 25, direction='y', series_n=0, show_scalar=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:58.853950Z",
     "start_time": "2020-04-15T10:42:58.790950Z"
    }
   },
   "outputs": [],
   "source": [
    "vtk_object = gp.plot_3d(geo_model, plotter_type='background')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:58.856950Z",
     "start_time": "2020-04-15T10:42:58.854950Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vtk_object.toggle_live_updating()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style  type=\"text/css\" >\n",
       "    #T_f6dfee22_9911_11ea_a41e_5cf370744477row0_col3 {\n",
       "            background-color:  #015482;\n",
       "        }    #T_f6dfee22_9911_11ea_a41e_5cf370744477row1_col3 {\n",
       "            background-color:  #9f0052;\n",
       "        }</style><table id=\"T_f6dfee22_9911_11ea_a41e_5cf370744477\" ><thead>    <tr>        <th class=\"blank level0\" ></th>        <th class=\"col_heading level0 col0\" >surface</th>        <th class=\"col_heading level0 col1\" >series</th>        <th class=\"col_heading level0 col2\" >order_surfaces</th>        <th class=\"col_heading level0 col3\" >color</th>        <th class=\"col_heading level0 col4\" >id</th>    </tr></thead><tbody>\n",
       "                <tr>\n",
       "                        <th id=\"T_f6dfee22_9911_11ea_a41e_5cf370744477level0_row0\" class=\"row_heading level0 row0\" >0</th>\n",
       "                        <td id=\"T_f6dfee22_9911_11ea_a41e_5cf370744477row0_col0\" class=\"data row0 col0\" >surface1</td>\n",
       "                        <td id=\"T_f6dfee22_9911_11ea_a41e_5cf370744477row0_col1\" class=\"data row0 col1\" >Default series</td>\n",
       "                        <td id=\"T_f6dfee22_9911_11ea_a41e_5cf370744477row0_col2\" class=\"data row0 col2\" >1</td>\n",
       "                        <td id=\"T_f6dfee22_9911_11ea_a41e_5cf370744477row0_col3\" class=\"data row0 col3\" >#015482</td>\n",
       "                        <td id=\"T_f6dfee22_9911_11ea_a41e_5cf370744477row0_col4\" class=\"data row0 col4\" >1</td>\n",
       "            </tr>\n",
       "            <tr>\n",
       "                        <th id=\"T_f6dfee22_9911_11ea_a41e_5cf370744477level0_row1\" class=\"row_heading level0 row1\" >1</th>\n",
       "                        <td id=\"T_f6dfee22_9911_11ea_a41e_5cf370744477row1_col0\" class=\"data row1 col0\" >surface2</td>\n",
       "                        <td id=\"T_f6dfee22_9911_11ea_a41e_5cf370744477row1_col1\" class=\"data row1 col1\" >Default series</td>\n",
       "                        <td id=\"T_f6dfee22_9911_11ea_a41e_5cf370744477row1_col2\" class=\"data row1 col2\" >2</td>\n",
       "                        <td id=\"T_f6dfee22_9911_11ea_a41e_5cf370744477row1_col3\" class=\"data row1 col3\" >#9f0052</td>\n",
       "                        <td id=\"T_f6dfee22_9911_11ea_a41e_5cf370744477row1_col4\" class=\"data row1 col4\" >2</td>\n",
       "            </tr>\n",
       "    </tbody></table>"
      ],
      "text/plain": [
       "    surface          series  order_surfaces    color  id\n",
       "0  surface1  Default series               1  #015482   1\n",
       "1  surface2  Default series               2  #9f0052   2"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "geo_model.surfaces"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:59.065951Z",
     "start_time": "2020-04-15T10:42:58.857951Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>X</th>\n",
       "      <th>Y</th>\n",
       "      <th>Z</th>\n",
       "      <th>smooth</th>\n",
       "      <th>surface</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>400.0</td>\n",
       "      <td>300.0</td>\n",
       "      <td>-300.0</td>\n",
       "      <td>0.000001</td>\n",
       "      <td>surface1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>600.0</td>\n",
       "      <td>300.0</td>\n",
       "      <td>-500.0</td>\n",
       "      <td>0.000001</td>\n",
       "      <td>surface1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "       X      Y      Z    smooth   surface\n",
       "0  400.0  300.0 -300.0  0.000001  surface1\n",
       "1  600.0  300.0 -500.0  0.000001  surface1"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "geo_model.modify_surface_points(0, Z=-300, plot_object=vtk_object)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>X</th>\n",
       "      <th>Y</th>\n",
       "      <th>Z</th>\n",
       "      <th>G_x</th>\n",
       "      <th>G_y</th>\n",
       "      <th>G_z</th>\n",
       "      <th>smooth</th>\n",
       "      <th>surface</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.00001</td>\n",
       "      <td>0.00001</td>\n",
       "      <td>0.00001</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.01</td>\n",
       "      <td>surface1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.00000</td>\n",
       "      <td>1.00000</td>\n",
       "      <td>1.00000</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.01</td>\n",
       "      <td>surface1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "         X        Y        Z  G_x  G_y  G_z  smooth   surface\n",
       "0  0.00001  0.00001  0.00001  0.0  0.0  1.0    0.01  surface1\n",
       "1  1.00000  1.00000  1.00000  1.0  1.0  1.0    0.01  surface1"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "geo_model.add_orientations(1,1,1, 'surface1', pole_vector=(1,1,1), plot_object=vtk_object)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Passing the vtk object to qgrid"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:59.208951Z",
     "start_time": "2020-04-15T10:42:59.066951Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<gempy.core.qgrid_integration.QgridModelIntegration at 0x25796b9e470>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gp.activate_interactive_df(geo_model, vtk_object)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It is important to get df with get to update the models sinde the `activate_interactive` method is called"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:59.224950Z",
     "start_time": "2020-04-15T10:42:59.209951Z"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "499ed3228adc47c39b96d15fcdb64f11",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "QgridWidget(grid_options={'fullWidthRows': True, 'syncColumnCellResize': True, 'forceFitColumns': True, 'defau…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "i:\\pycharmprojects\\gempy\\gempy\\core\\solution.py:315: UserWarning: Surfaces not computed due to: No surface found at the given iso value.. The surface is: Series: No surface found at the given iso value.; Surface Number:1\n",
      "  '; Surface Number:' + str(s_n))\n"
     ]
    }
   ],
   "source": [
    "geo_model.qi.get('orientations')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:59.239950Z",
     "start_time": "2020-04-15T10:42:59.224950Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "bed08b004c094e15aae01c85810053b9",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "QgridWidget(grid_options={'fullWidthRows': True, 'syncColumnCellResize': True, 'forceFitColumns': True, 'defau…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AssertionError: Model not computed. Laking data in some surface\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:root:Encountered issue in callback: Input dimension mis-match. (input[0].shape[1] = 0, input[1].shape[1] = 1)\n",
      "Apply node that caused the error: Elemwise{sub,no_inplace}(Subtensor{::, int64:int64:}.0, Subtensor{::, int64:int64:}.0)\n",
      "Toposort index: 111\n",
      "Inputs types: [TensorType(float64, matrix), TensorType(float64, matrix)]\n",
      "Inputs shapes: [(0, 0), (0, 1)]\n",
      "Inputs strides: [(1000016, 8), (1000016, 8)]\n",
      "Inputs values: [array([], shape=(0, 0), dtype=float64), array([], shape=(0, 1), dtype=float64)]\n",
      "Inputs type_num: [12, 12]\n",
      "Outputs clients: [[Elemwise{add,no_inplace}(Elemwise{sub,no_inplace}.0, TensorConstant{(1, 1) of 0.0001})]]\n",
      "\n",
      "Backtrace when the node is created(use Theano flag traceback.limit=N to make it longer):\n",
      "  File \"i:\\pycharmprojects\\gempy\\gempy\\core\\interpolator.py\", line 1027, in compile_th_fn_geo\n",
      "    self.theano_graph.theano_output(),\n",
      "  File \"i:\\pycharmprojects\\gempy\\gempy\\core\\theano_modules\\theano_graph_pro.py\", line 558, in theano_output\n",
      "    solutions[:9] = self.compute_series()\n",
      "  File \"i:\\pycharmprojects\\gempy\\gempy\\core\\theano_modules\\theano_graph_pro.py\", line 432, in compute_series\n",
      "    profile=False\n",
      "  File \"C:\\Users\\legui\\miniconda3\\envs\\gp-dev\\lib\\site-packages\\theano\\scan_module\\scan.py\", line 774, in scan\n",
      "    condition, outputs, updates = scan_utils.get_updates_and_outputs(fn(*args))\n",
      "  File \"i:\\pycharmprojects\\gempy\\gempy\\core\\theano_modules\\theano_graph_pro.py\", line 1881, in compute_a_series\n",
      "    self.solve_kriging(b),\n",
      "  File \"i:\\pycharmprojects\\gempy\\gempy\\core\\theano_modules\\theano_graph_pro.py\", line 1188, in solve_kriging\n",
      "    C_matrix = self.covariance_matrix()\n",
      "  File \"i:\\pycharmprojects\\gempy\\gempy\\core\\theano_modules\\theano_graph_pro.py\", line 1090, in covariance_matrix\n",
      "    F_I, F_G = self.faults_matrix()\n",
      "  File \"i:\\pycharmprojects\\gempy\\gempy\\core\\theano_modules\\theano_graph_pro.py\", line 1063, in faults_matrix\n",
      "    F_I = (self.fault_drift_at_surface_points_ref - self.fault_drift_at_surface_points_rest) + 0.0001\n",
      "\n",
      "Debugprint of the apply node: \n",
      "Elemwise{sub,no_inplace} [id A] <TensorType(float64, matrix)> ''   \n",
      " |Subtensor{::, int64:int64:} [id B] <TensorType(float64, matrix)> ''   \n",
      " | |Elemwise{mul,no_inplace} [id C] <TensorType(float64, matrix)> ''   \n",
      " | | |AdvancedSubtensor [id D] <TensorType(float64, matrix)> ''   \n",
      " | | | |<TensorType(float64, 3D)> [id E] <TensorType(float64, 3D)>\n",
      " | | | |Subtensor{int64} [id F] <TensorType(int64, vector)> ''   \n",
      " | | | | |Nonzero [id G] <TensorType(int64, matrix)> ''   \n",
      " | | | | | |Elemwise{Cast{int8}} [id H] <TensorType(int8, vector)> ''   \n",
      " | | | | |   |Subtensor{::, int8} [id I] <TensorType(int32, vector)> ''   \n",
      " | | | | |     |fault relation matrix_copy [id J] <TensorType(int32, matrix)>\n",
      " | | | | |     |ScalarFromTensor [id K] <int8> ''   \n",
      " | | | | |       |Elemwise{Cast{int8}} [id L] <TensorType(int8, scalar)> ''   \n",
      " | | | | |         |<TensorType(int32, scalar)> [id M] <TensorType(int32, scalar)>\n",
      " | | | | |Constant{0} [id N] <int64>\n",
      " | | | |TensorConstant{0} [id O] <TensorType(int64, scalar)>\n",
      " | | | |MakeSlice [id P] <slice> ''   \n",
      " | | |   |TensorConstant{0} [id Q] <TensorType(int8, scalar)>\n",
      " | | |   |Elemwise{add,no_inplace} [id R] <TensorType(int64, scalar)> ''   \n",
      " | | |   | |Elemwise{add,no_inplace} [id S] <TensorType(int64, scalar)> ''   \n",
      " | | |   | | |Subtensor{int64} [id T] <TensorType(int64, scalar)> ''   \n",
      " | | |   | | | |Shape [id U] <TensorType(int64, vector)> ''   \n",
      " | | |   | | | | |Coordinates of the grid points to interpolate_copy [id V] <TensorType(float64, matrix)>\n",
      " | | |   | | | |Constant{0} [id N] <int64>\n",
      " | | |   | | |Elemwise{mul,no_inplace} [id W] <TensorType(int64, scalar)> ''   \n",
      " | | |   | |   |TensorConstant{2} [id X] <TensorType(int8, scalar)>\n",
      " | | |   | |   |Elemwise{sub,no_inplace} [id Y] <TensorType(int64, scalar)> ''   \n",
      " | | |   | |     |Subtensor{int64} [id Z] <TensorType(int64, scalar)> ''   \n",
      " | | |   | |     | |Shape [id BA] <TensorType(int64, vector)> ''   \n",
      " | | |   | |     | | |All the surface_points points at once_copy [id BB] <TensorType(float64, matrix)>\n",
      " | | |   | |     | |Constant{0} [id N] <int64>\n",
      " | | |   | |     |Subtensor{int64} [id BC] <TensorType(int64, scalar)> ''   \n",
      " | | |   | |       |Shape [id BD] <TensorType(int64, vector)> ''   \n",
      " | | |   | |       | |Number of points per surface used to split rest-ref_copy [id BE] <TensorType(int32, vector)>\n",
      " | | |   | |       |Constant{0} [id N] <int64>\n",
      " | | |   | |TensorConstant{0} [id Q] <TensorType(int8, scalar)>\n",
      " | | |   |NoneConst [id BF] <NoneTypeT>\n",
      " | | |InplaceDimShuffle{x,x} [id BG] <TensorType(float64, (True, True))> ''   \n",
      " | |   |<TensorType(float64, scalar)> [id BH] <TensorType(float64, scalar)>\n",
      " | |ScalarFromTensor [id BI] <int64> ''   \n",
      " | | |Elemwise{add,no_inplace} [id BJ] <TensorType(int64, scalar)> ''   \n",
      " | |   |Elemwise{add,no_inplace} [id BK] <TensorType(int64, scalar)> ''   \n",
      " | |   | |Subtensor{int64} [id T] <TensorType(int64, scalar)> ''   \n",
      " | |   | |Elemwise{sub,no_inplace} [id Y] <TensorType(int64, scalar)> ''   \n",
      " | |   |Length of surface_points in every series[t] [id BL] <TensorType(int32, scalar)>\n",
      " | |ScalarFromTensor [id BM] <int64> ''   \n",
      " |   |Elemwise{add,no_inplace} [id BN] <TensorType(int64, scalar)> ''   \n",
      " |     |Elemwise{add,no_inplace} [id BK] <TensorType(int64, scalar)> ''   \n",
      " |     |Length of surface_points in every series[t+1] [id BO] <TensorType(int32, scalar)>\n",
      " |Subtensor{::, int64:int64:} [id BP] <TensorType(float64, matrix)> ''   \n",
      "   |Elemwise{mul,no_inplace} [id C] <TensorType(float64, matrix)> ''   \n",
      "   |ScalarFromTensor [id BQ] <int64> ''   \n",
      "   | |Elemwise{add,no_inplace} [id BR] <TensorType(int64, scalar)> ''   \n",
      "   |   |Subtensor{int64} [id T] <TensorType(int64, scalar)> ''   \n",
      "   |   |Length of surface_points in every series[t] [id BL] <TensorType(int32, scalar)>\n",
      "   |ScalarFromTensor [id BS] <int64> ''   \n",
      "     |Elemwise{add,no_inplace} [id BT] <TensorType(int64, scalar)> ''   \n",
      "       |Subtensor{int64} [id T] <TensorType(int64, scalar)> ''   \n",
      "       |Length of surface_points in every series[t+1] [id BO] <TensorType(int32, scalar)>\n",
      "\n",
      "HINT: Use the Theano flag 'exception_verbosity=high' for a debugprint and storage map footprint of this apply node.\n",
      "Apply node that caused the error: for{cpu,Looping}(Elemwise{minimum,no_inplace}.0, Subtensor{:int64:}.0, Subtensor{:int64:}.0, Subtensor{:int64:}.0, Subtensor{:int64:}.0, Subtensor{:int64:}.0, Subtensor{:int64:}.0, Subtensor{:int64:}.0, Subtensor{:int64:}.0, Subtensor{:int64:}.0, Subtensor{:int64:}.0, Subtensor{:int64:}.0, Subtensor{:int64:}.0, Subtensor{:int64:}.0, Subtensor{:int64:}.0, Subtensor{:int64:}.0, Subtensor{:int64:}.0, IncSubtensor{Set;:int64:}.0, IncSubtensor{Set;:int64:}.0, IncSubtensor{Set;:int64:}.0, IncSubtensor{Set;:int64:}.0, IncSubtensor{Set;:int64:}.0, IncSubtensor{Set;:int64:}.0, IncSubtensor{Set;:int64:}.0, IncSubtensor{Set;:int64:}.0, Number of points per surface used to split rest-ref, fault relation matrix, <TensorType(float64, scalar)>, <TensorType(float64, scalar)>, Range, Covariance at 0, <TensorType(float64, scalar)>, Nugget effect of gradients, Nugget effect of scalar, Attenuation factor, Sigmoid Outside, Sigmoid slope, <TensorType(int32, vector)>, <TensorType(bool, vector)>, <TensorType(int32, vector)>, Coordinates of the grid points to interpolate, All the surface_points points at once, Position of the dips, Angle of every dip, Azimuth, Polarity, Values that the blocks are taking)\n",
      "Toposort index: 157\n",
      "Inputs types: [TensorType(int64, scalar), TensorType(int32, vector), TensorType(int32, vector), TensorType(int32, vector), TensorType(int32, vector), TensorType(int32, vector), TensorType(int32, vector), TensorType(int32, vector), TensorType(int32, vector), TensorType(int32, vector), TensorType(bool, vector), TensorType(bool, vector), TensorType(bool, vector), TensorType(int32, vector), TensorType(int32, vector), TensorType(int32, vector), TensorType(int32, vector), TensorType(float64, 4D), TensorType(float64, matrix), TensorType(float64, 3D), TensorType(float64, 3D), TensorType(bool, 3D), TensorType(bool, 3D), TensorType(float64, 4D), TensorType(int64, vector), TensorType(int32, vector), TensorType(int32, matrix), TensorType(float64, scalar), TensorType(float64, scalar), TensorType(float64, scalar), TensorType(float64, scalar), TensorType(float64, scalar), TensorType(float64, vector), TensorType(float64, vector), TensorType(float64, scalar), TensorType(float64, scalar), TensorType(float64, scalar), TensorType(int32, vector), TensorType(bool, vector), TensorType(int32, vector), TensorType(float64, matrix), TensorType(float64, matrix), TensorType(float64, matrix), TensorType(float64, vector), TensorType(float64, vector), TensorType(float64, vector), TensorType(float64, matrix)]\n",
      "Inputs shapes: [(), (1,), (1,), (1,), (1,), (1,), (1,), (1,), (1,), (1,), (1,), (1,), (1,), (1,), (1,), (1,), (1,), (2, 1, 1, 125002), (2, 10), (2, 1, 125002), (2, 1, 1), (2, 1, 125002), (2, 1, 125002), (2, 1, 1, 125002), (2,), (2,), (1, 1), (), (), (), (), (), (6,), (4,), (), (), (), (1,), (1,), (1,), (125000, 3), (4, 3), (2, 3), (2,), (2,), (2,), (1, 3)]\n",
      "Inputs strides: [(), (4,), (4,), (4,), (4,), (4,), (4,), (4,), (4,), (4,), (1,), (1,), (1,), (4,), (4,), (4,), (4,), (1000016, 1000016, 1000016, 8), (80, 8), (1000016, 1000016, 8), (8, 8, 8), (125002, 125002, 1), (125002, 125002, 1), (1000016, 1000016, 1000016, 8), (8,), (4,), (4, 4), (), (), (), (), (), (8,), (8,), (), (), (), (4,), (1,), (4,), (24, 8), (8, 32), (8, 16), (8,), (8,), (8,), (24, 8)]\n",
      "Inputs values: [array(1, dtype=int64), array([0]), array([1]), array([0]), array([2]), array([0]), array([10]), array([0]), array([1]), array([3]), array([ True]), array([ True]), array([ True]), array([0]), array([0]), array([0]), array([0]), 'not shown', 'not shown', 'not shown', array([[[0.e+000]],\n",
      "\n",
      "       [[5.e-323]]]), 'not shown', 'not shown', 'not shown', array([ 0, 10], dtype=int64), array([1, 1]), array([[0]]), array(10.), array(2.), array(1.41068677), array(58.17574207), array(4.), 'not shown', array([1.e-06, 1.e-06, 1.e-06, 1.e-06]), array(2.), array(50.), array(50000.), array([0]), array([False]), array([0]), 'not shown', 'not shown', 'not shown', array([0., 0.]), array([0., 0.]), array([1., 1.]), array([[1., 2., 3.]])]\n",
      "Inputs type_num: [9, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 12, 12, 12, 12, 0, 0, 12, 9, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 7, 0, 7, 12, 12, 12, 12, 12, 12, 12]\n",
      "Outputs clients: [[Subtensor{int64::}(for{cpu,Looping}.0, Constant{1})], [Subtensor{int64::}(for{cpu,Looping}.1, Constant{1})], [Subtensor{int64::}(for{cpu,Looping}.2, Constant{1})], [Subtensor{int64::}(for{cpu,Looping}.3, Constant{1})], [Subtensor{int64::}(for{cpu,Looping}.4, Constant{1})], [Subtensor{int64::}(for{cpu,Looping}.5, Constant{1})], [], []]\n",
      "\n",
      "Backtrace when the node is created(use Theano flag traceback.limit=N to make it longer):\n",
      "  File \"C:\\Users\\legui\\miniconda3\\envs\\gp-dev\\lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3063, in run_cell_async\n",
      "    interactivity=interactivity, compiler=compiler, result=result)\n",
      "  File \"C:\\Users\\legui\\miniconda3\\envs\\gp-dev\\lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3254, in run_ast_nodes\n",
      "    if (await self.run_code(code, result,  async_=asy)):\n",
      "  File \"C:\\Users\\legui\\miniconda3\\envs\\gp-dev\\lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3331, in run_code\n",
      "    exec(code_obj, self.user_global_ns, self.user_ns)\n",
      "  File \"<ipython-input-3-4c4b16d0ba3b>\", line 1, in <module>\n",
      "    gp.set_interpolator(geo_model, theano_optimizer='fast_run',  verbose=[])\n",
      "  File \"i:\\pycharmprojects\\gempy\\gempy\\api_modules\\setters.py\", line 108, in set_interpolator\n",
      "    geo_model._interpolator.compile_th_fn_geo(inplace=True, grid=grid)\n",
      "  File \"i:\\pycharmprojects\\gempy\\gempy\\core\\interpolator.py\", line 1027, in compile_th_fn_geo\n",
      "    self.theano_graph.theano_output(),\n",
      "  File \"i:\\pycharmprojects\\gempy\\gempy\\core\\theano_modules\\theano_graph_pro.py\", line 558, in theano_output\n",
      "    solutions[:9] = self.compute_series()\n",
      "  File \"i:\\pycharmprojects\\gempy\\gempy\\core\\theano_modules\\theano_graph_pro.py\", line 432, in compute_series\n",
      "    profile=False\n",
      "\n",
      "Debugprint of the apply node: \n",
      "for{cpu,Looping}.0 [id A] <TensorType(float64, 4D)> ''   \n",
      " |Elemwise{minimum,no_inplace} [id B] <TensorType(int64, scalar)> ''   \n",
      " | |Elemwise{minimum,no_inplace} [id C] <TensorType(int64, scalar)> ''   \n",
      " | | |Elemwise{minimum,no_inplace} [id D] <TensorType(int64, scalar)> ''   \n",
      " | | | |Elemwise{minimum,no_inplace} [id E] <TensorType(int64, scalar)> ''   \n",
      " | | | | |Elemwise{minimum,no_inplace} [id F] <TensorType(int64, scalar)> ''   \n",
      " | | | | | |Elemwise{minimum,no_inplace} [id G] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | |Elemwise{minimum,no_inplace} [id H] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | | |Elemwise{minimum,no_inplace} [id I] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | | | |Elemwise{minimum,no_inplace} [id J] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | | | | |Elemwise{minimum,no_inplace} [id K] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | | | | | |Elemwise{minimum,no_inplace} [id L] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | | | | | | |Elemwise{minimum,no_inplace} [id M] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | | | | | | | |Elemwise{minimum,no_inplace} [id N] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | | | | | | | | |Elemwise{minimum,no_inplace} [id O] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | | | | | | | | | |Elemwise{minimum,no_inplace} [id P] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | | | | | | | | | | |Subtensor{int64} [id Q] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | | | | | | | | | | | |Shape [id R] <TensorType(int64, vector)> ''   \n",
      " | | | | | | | | | | | | | | | | | |Subtensor{int64:int64:} [id S] <TensorType(int32, vector)> 'Length of surface_points in every series[0:-1]'   \n",
      " | | | | | | | | | | | | | | | | |Constant{0} [id T] <int64>\n",
      " | | | | | | | | | | | | | | | |Subtensor{int64} [id U] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | | | | | | | | | |   |Shape [id V] <TensorType(int64, vector)> ''   \n",
      " | | | | | | | | | | | | | | |   | |Subtensor{int64::} [id W] <TensorType(int32, vector)> 'Length of surface_points in every series[1:]'   \n",
      " | | | | | | | | | | | | | | |   |Constant{0} [id T] <int64>\n",
      " | | | | | | | | | | | | | | |Subtensor{int64} [id X] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | | | | | | | | |   |Shape [id Y] <TensorType(int64, vector)> ''   \n",
      " | | | | | | | | | | | | | |   | |Subtensor{int64:int64:} [id Z] <TensorType(int32, vector)> 'Length of foliations in every series[0:-1]'   \n",
      " | | | | | | | | | | | | | |   |Constant{0} [id T] <int64>\n",
      " | | | | | | | | | | | | | |Subtensor{int64} [id BA] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | | | | | | | |   |Shape [id BB] <TensorType(int64, vector)> ''   \n",
      " | | | | | | | | | | | | |   | |Subtensor{int64::} [id BC] <TensorType(int32, vector)> 'Length of foliations in every series[1:]'   \n",
      " | | | | | | | | | | | | |   |Constant{0} [id T] <int64>\n",
      " | | | | | | | | | | | | |Subtensor{int64} [id BD] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | | | | | | |   |Shape [id BE] <TensorType(int64, vector)> ''   \n",
      " | | | | | | | | | | | |   | |Subtensor{int64:int64:} [id BF] <TensorType(int32, vector)> 'Length of weights in every series[0:-1]'   \n",
      " | | | | | | | | | | | |   |Constant{0} [id T] <int64>\n",
      " | | | | | | | | | | | |Subtensor{int64} [id BG] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | | | | | |   |Shape [id BH] <TensorType(int64, vector)> ''   \n",
      " | | | | | | | | | | |   | |Subtensor{int64::} [id BI] <TensorType(int32, vector)> 'Length of weights in every series[1:]'   \n",
      " | | | | | | | | | | |   |Constant{0} [id T] <int64>\n",
      " | | | | | | | | | | |Subtensor{int64} [id BJ] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | | | | |   |Shape [id BK] <TensorType(int64, vector)> ''   \n",
      " | | | | | | | | | |   | |Subtensor{int64:int64:} [id BL] <TensorType(int32, vector)> 'List with the number of surfaces[0:-1]'   \n",
      " | | | | | | | | | |   |Constant{0} [id T] <int64>\n",
      " | | | | | | | | | |Subtensor{int64} [id BM] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | | | |   |Shape [id BN] <TensorType(int64, vector)> ''   \n",
      " | | | | | | | | |   | |Subtensor{int64::} [id BO] <TensorType(int32, vector)> 'List with the number of surfaces[1:]'   \n",
      " | | | | | | | | |   |Constant{0} [id T] <int64>\n",
      " | | | | | | | | |Subtensor{int64} [id BP] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | | |   |Shape [id BQ] <TensorType(int64, vector)> ''   \n",
      " | | | | | | | |   | |Subtensor{int64::} [id BR] <TensorType(int32, vector)> 'Grade of the universal drift[0:]'   \n",
      " | | | | | | | |   |Constant{0} [id T] <int64>\n",
      " | | | | | | | |Subtensor{int64} [id BS] <TensorType(int64, scalar)> ''   \n",
      " | | | | | | |   |Shape [id BT] <TensorType(int64, vector)> ''   \n",
      " | | | | | | |   | |Subtensor{int64::} [id BU] <TensorType(bool, vector)> 'Vector controlling if weights must be recomputed[0:]'   \n",
      " | | | | | | |   |Constant{0} [id T] <int64>\n",
      " | | | | | | |Subtensor{int64} [id BV] <TensorType(int64, scalar)> ''   \n",
      " | | | | | |   |Shape [id BW] <TensorType(int64, vector)> ''   \n",
      " | | | | | |   | |Subtensor{int64::} [id BX] <TensorType(bool, vector)> 'Vector controlling if scalar matrix must be recomputed[0:]'   \n",
      " | | | | | |   |Constant{0} [id T] <int64>\n",
      " | | | | | |Subtensor{int64} [id BY] <TensorType(int64, scalar)> ''   \n",
      " | | | | |   |Shape [id BZ] <TensorType(int64, vector)> ''   \n",
      " | | | | |   | |Subtensor{int64::} [id CA] <TensorType(bool, vector)> 'Vector controlling if block matrix must be recomputed[0:]'   \n",
      " | | | | |   |Constant{0} [id T] <int64>\n",
      " | | | | |Subtensor{int64} [id CB] <TensorType(int64, scalar)> ''   \n",
      " | | | |   |Shape [id CC] <TensorType(int64, vector)> ''   \n",
      " | | | |   | |Subtensor{int64::} [id CD] <TensorType(int32, vector)> 'The series (fault) is finite[0:]'   \n",
      " | | | |   |Constant{0} [id T] <int64>\n",
      " | | | |Subtensor{int64} [id CE] <TensorType(int64, scalar)> ''   \n",
      " | | |   |Shape [id CF] <TensorType(int64, vector)> ''   \n",
      " | | |   | |Subtensor{int64::} [id CG] <TensorType(int32, vector)> ''   \n",
      " | | |   |   |<TensorType(int32, vector)> [id CH] <TensorType(int32, vector)>\n",
      " | | |   |   |Constant{0} [id T] <int64>\n",
      " | | |   |Constant{0} [id T] <int64>\n",
      " | | |Subtensor{int64} [id CI] <TensorType(int64, scalar)> ''   \n",
      " | |   |Shape [id CJ] <TensorType(int64, vector)> ''   \n",
      " | |   | |Subtensor{int64::} [id CK] <TensorType(int32, vector)> ''   \n",
      " | |   |   |<TensorType(int32, vector)> [id CL] <TensorType(int32, vector)>\n",
      " | |   |   |Constant{0} [id T] <int64>\n",
      " | |   |Constant{0} [id T] <int64>\n",
      " | |TensorConstant{5000} [id CM] <TensorType(int64, scalar)>\n",
      " |Subtensor{:int64:} [id CN] <TensorType(int32, vector)> ''   \n",
      " | |Subtensor{int64:int64:} [id S] <TensorType(int32, vector)> 'Length of surface_points in every series[0:-1]'   \n",
      " | |ScalarFromTensor [id CO] <int64> ''   \n",
      " |   |Elemwise{minimum,no_inplace} [id B] <TensorType(int64, scalar)> ''   \n",
      " |Subtensor{:int64:} [id CP] <TensorType(int32, vector)> ''   \n",
      " | |Subtensor{int64::} [id W] <TensorType(int32, vector)> 'Length of surface_points in every series[1:]'   \n",
      " | |ScalarFromTensor [id CO] <int64> ''   \n",
      " |Subtensor{:int64:} [id CQ] <TensorType(int32, vector)> ''   \n",
      " | |Subtensor{int64:int64:} [id Z] <TensorType(int32, vector)> 'Length of foliations in every series[0:-1]'   \n",
      " | |ScalarFromTensor [id CO] <int64> ''   \n",
      " |Subtensor{:int64:} [id CR] <TensorType(int32, vector)> ''   \n",
      " | |Subtensor{int64::} [id BC] <TensorType(int32, vector)> 'Length of foliations in every series[1:]'   \n",
      " | |ScalarFromTensor [id CO] <int64> ''   \n",
      " |Subtensor{:int64:} [id CS] <TensorType(int32, vector)> ''   \n",
      " | |Subtensor{int64:int64:} [id BF] <TensorType(int32, vector)> 'Length of weights in every series[0:-1]'   \n",
      " | |ScalarFromTensor [id CO] <int64> ''   \n",
      " |Subtensor{:int64:} [id CT] <TensorType(int32, vector)> ''   \n",
      " | |Subtensor{int64::} [id BI] <TensorType(int32, vector)> 'Length of weights in every series[1:]'   \n",
      " | |ScalarFromTensor [id CO] <int64> ''   \n",
      " |Subtensor{:int64:} [id CU] <TensorType(int32, vector)> ''   \n",
      " | |Subtensor{int64:int64:} [id BL] <TensorType(int32, vector)> 'List with the number of surfaces[0:-1]'   \n",
      " | |ScalarFromTensor [id CO] <int64> ''   \n",
      " |Subtensor{:int64:} [id CV] <TensorType(int32, vector)> ''   \n",
      " | |Subtensor{int64::} [id BO] <TensorType(int32, vector)> 'List with the number of surfaces[1:]'   \n",
      " | |ScalarFromTensor [id CO] <int64> ''   \n",
      " |Subtensor{:int64:} [id CW] <TensorType(int32, vector)> ''   \n",
      " | |Subtensor{int64::} [id BR] <TensorType(int32, vector)> 'Grade of the universal drift[0:]'   \n",
      " | |ScalarFromTensor [id CO] <int64> ''   \n",
      " |Subtensor{:int64:} [id CX] <TensorType(bool, vector)> ''   \n",
      " | |Subtensor{int64::} [id BU] <TensorType(bool, vector)> 'Vector controlling if weights must be recomputed[0:]'   \n",
      " | |ScalarFromTensor [id CO] <int64> ''   \n",
      " |Subtensor{:int64:} [id CY] <TensorType(bool, vector)> ''   \n",
      " | |Subtensor{int64::} [id BX] <TensorType(bool, vector)> 'Vector controlling if scalar matrix must be recomputed[0:]'   \n",
      " | |ScalarFromTensor [id CO] <int64> ''   \n",
      " |Subtensor{:int64:} [id CZ] <TensorType(bool, vector)> ''   \n",
      " | |Subtensor{int64::} [id CA] <TensorType(bool, vector)> 'Vector controlling if block matrix must be recomputed[0:]'   \n",
      " | |ScalarFromTensor [id CO] <int64> ''   \n",
      " |Subtensor{:int64:} [id DA] <TensorType(int32, vector)> ''   \n",
      " | |Subtensor{int64::} [id CD] <TensorType(int32, vector)> 'The series (fault) is finite[0:]'   \n",
      " | |ScalarFromTensor [id CO] <int64> ''   \n",
      " |Subtensor{:int64:} [id DB] <TensorType(int32, vector)> ''   \n",
      " | |Subtensor{int64::} [id CG] <TensorType(int32, vector)> ''   \n",
      " | |ScalarFromTensor [id CO] <int64> ''   \n",
      " |Subtensor{:int64:} [id DC] <TensorType(int32, vector)> ''   \n",
      " | |Subtensor{int64::} [id CK] <TensorType(int32, vector)> ''   \n",
      " | |ScalarFromTensor [id CO] <int64> ''   \n",
      " |Subtensor{:int64:} [id DD] <TensorType(int32, vector)> ''   \n",
      " | |TensorConstant{[   0    1..4998 4999]} [id DE] <TensorType(int32, vector)>\n",
      " | |ScalarFromTensor [id CO] <int64> ''   \n",
      " |IncSubtensor{Set;:int64:} [id DF] <TensorType(float64, 4D)> ''   \n",
      " | |AllocEmpty{dtype='float64'} [id DG] <TensorType(float64, 4D)> ''   \n",
      " | | |Elemwise{add,no_inplace} [id DH] <TensorType(int64, scalar)> ''   \n",
      " | | | |Elemwise{minimum,no_inplace} [id B] <TensorType(int64, scalar)> ''   \n",
      " | | | |Subtensor{int64} [id DI] <TensorType(int64, scalar)> ''   \n",
      " | | |   |Shape [id DJ] <TensorType(int64, vector)> ''   \n",
      " | | |   | |Rebroadcast{0} [id DK] <TensorType(float64, 4D)> ''   \n",
      " | | |   |   |InplaceDimShuffle{x,0,1,2} [id DL] <TensorType(float64, (True, False, False, False))> ''   \n",
      " | | |   |     |block matrix [id DM] <TensorType(float64, 3D)>\n",
      " | | |   |Constant{0} [id T] <int64>\n",
      " | | |Subtensor{int64} [id DN] <TensorType(int64, scalar)> ''   \n",
      " | | | |Shape [id DJ] <TensorType(int64, vector)> ''   \n",
      " | | | |Constant{1} [id DO] <int64>\n",
      " | | |Subtensor{int64} [id DP] <TensorType(int64, scalar)> ''   \n",
      " | | | |Shape [id DJ] <TensorType(int64, vector)> ''   \n",
      " | | | |Constant{2} [id DQ] <int64>\n",
      " | | |Subtensor{int64} [id DR] <TensorType(int64, scalar)> ''   \n",
      " | |   |Shape [id DJ] <TensorType(int64, vector)> ''   \n",
      " | |   |Constant{3} [id DS] <int64>\n",
      " | |Rebroadcast{0} [id DK] <TensorType(float64, 4D)> ''   \n",
      " | |ScalarFromTensor [id DT] <int64> ''   \n",
      " |   |Subtensor{int64} [id DI] <TensorType(int64, scalar)> ''   \n",
      " |IncSubtensor{Set;:int64:} [id DU] <TensorType(float64, matrix)> ''   \n",
      " | |AllocEmpty{dtype='float64'} [id DV] <TensorType(float64, matrix)> ''   \n",
      " | | |Elemwise{add,no_inplace} [id DW] <TensorType(int64, scalar)> ''   \n",
      " | | | |Elemwise{minimum,no_inplace} [id B] <TensorType(int64, scalar)> ''   \n",
      " | | | |Subtensor{int64} [id DX] <TensorType(int64, scalar)> ''   \n",
      " | | |   |Shape [id DY] <TensorType(int64, vector)> ''   \n",
      " | | |   | |Rebroadcast{0} [id DZ] <TensorType(float64, matrix)> ''   \n",
      " | | |   |   |InplaceDimShuffle{x,0} [id EA] <TensorType(float64, row)> ''   \n",
      " | | |   |     |Weights vector [id EB] <TensorType(float64, vector)>\n",
      " | | |   |Constant{0} [id T] <int64>\n",
      " | | |Subtensor{int64} [id EC] <TensorType(int64, scalar)> ''   \n",
      " | |   |Shape [id DY] <TensorType(int64, vector)> ''   \n",
      " | |   |Constant{1} [id DO] <int64>\n",
      " | |Rebroadcast{0} [id DZ] <TensorType(float64, matrix)> ''   \n",
      " | |ScalarFromTensor [id ED] <int64> ''   \n",
      " |   |Subtensor{int64} [id DX] <TensorType(int64, scalar)> ''   \n",
      " |IncSubtensor{Set;:int64:} [id EE] <TensorType(float64, 3D)> ''   \n",
      " | |AllocEmpty{dtype='float64'} [id EF] <TensorType(float64, 3D)> ''   \n",
      " | | |Elemwise{add,no_inplace} [id EG] <TensorType(int64, scalar)> ''   \n",
      " | | | |Elemwise{minimum,no_inplace} [id B] <TensorType(int64, scalar)> ''   \n",
      " | | | |Subtensor{int64} [id EH] <TensorType(int64, scalar)> ''   \n",
      " | | |   |Shape [id EI] <TensorType(int64, vector)> ''   \n",
      " | | |   | |Rebroadcast{0} [id EJ] <TensorType(float64, 3D)> ''   \n",
      " | | |   |   |InplaceDimShuffle{x,0,1} [id EK] <TensorType(float64, (True, False, False))> ''   \n",
      " | | |   |     |Scalar matrix [id EL] <TensorType(float64, matrix)>\n",
      " | | |   |Constant{0} [id T] <int64>\n",
      " | | |Subtensor{int64} [id EM] <TensorType(int64, scalar)> ''   \n",
      " | | | |Shape [id EI] <TensorType(int64, vector)> ''   \n",
      " | | | |Constant{1} [id DO] <int64>\n",
      " | | |Subtensor{int64} [id EN] <TensorType(int64, scalar)> ''   \n",
      " | |   |Shape [id EI] <TensorType(int64, vector)> ''   \n",
      " | |   |Constant{2} [id DQ] <int64>\n",
      " | |Rebroadcast{0} [id EJ] <TensorType(float64, 3D)> ''   \n",
      " | |ScalarFromTensor [id EO] <int64> ''   \n",
      " |   |Subtensor{int64} [id EH] <TensorType(int64, scalar)> ''   \n",
      " |IncSubtensor{Set;:int64:} [id EP] <TensorType(float64, 3D)> ''   \n",
      " | |AllocEmpty{dtype='float64'} [id EQ] <TensorType(float64, 3D)> ''   \n",
      " | | |Elemwise{add,no_inplace} [id ER] <TensorType(int64, scalar)> ''   \n",
      " | | | |Elemwise{minimum,no_inplace} [id B] <TensorType(int64, scalar)> ''   \n",
      " | | | |Subtensor{int64} [id ES] <TensorType(int64, scalar)> ''   \n",
      " | | |   |Shape [id ET] <TensorType(int64, vector)> ''   \n",
      " | | |   | |Rebroadcast{0} [id EU] <TensorType(float64, 3D)> ''   \n",
      " | | |   |   |InplaceDimShuffle{x,0,1} [id EV] <TensorType(float64, (True, False, False))> ''   \n",
      " | | |   |     |Alloc [id EW] <TensorType(float64, matrix)> ''   \n",
      " | | |   |       |TensorConstant{0.0} [id EX] <TensorType(float64, scalar)>\n",
      " | | |   |       |Subtensor{int64} [id EY] <TensorType(int64, scalar)> ''   \n",
      " | | |   |       | |Shape [id EZ] <TensorType(int64, vector)> ''   \n",
      " | | |   |       | | |<TensorType(int32, vector)> [id CH] <TensorType(int32, vector)>\n",
      " | | |   |       | |Constant{0} [id T] <int64>\n",
      " | | |   |       |Subtensor{int64} [id FA] <TensorType(int32, scalar)> ''   \n",
      " | | |   |         |List with the number of surfaces [id FB] <TensorType(int32, vector)>\n",
      " | | |   |         |Constant{-1} [id FC] <int64>\n",
      " | | |   |Constant{0} [id T] <int64>\n",
      " | | |Subtensor{int64} [id FD] <TensorType(int64, scalar)> ''   \n",
      " | | | |Shape [id ET] <TensorType(int64, vector)> ''   \n",
      " | | | |Constant{1} [id DO] <int64>\n",
      " | | |Subtensor{int64} [id FE] <TensorType(int64, scalar)> ''   \n",
      " | |   |Shape [id ET] <TensorType(int64, vector)> ''   \n",
      " | |   |Constant{2} [id DQ] <int64>\n",
      " | |Rebroadcast{0} [id EU] <TensorType(float64, 3D)> ''   \n",
      " | |ScalarFromTensor [id FF] <int64> ''   \n",
      " |   |Subtensor{int64} [id ES] <TensorType(int64, scalar)> ''   \n",
      " |IncSubtensor{Set;:int64:} [id FG] <TensorType(bool, 3D)> ''   \n",
      " | |AllocEmpty{dtype='bool'} [id FH] <TensorType(bool, 3D)> ''   \n",
      " | | |Elemwise{add,no_inplace} [id FI] <TensorType(int64, scalar)> ''   \n",
      " | | | |Elemwise{minimum,no_inplace} [id B] <TensorType(int64, scalar)> ''   \n",
      " | | | |Subtensor{int64} [id FJ] <TensorType(int64, scalar)> ''   \n",
      " | | |   |Shape [id FK] <TensorType(int64, vector)> ''   \n",
      " | | |   | |Rebroadcast{0} [id FL] <TensorType(bool, 3D)> ''   \n",
      " | | |   |   |InplaceDimShuffle{x,0,1} [id FM] <TensorType(bool, (True, False, False))> ''   \n",
      " | | |   |     |mask matrix [id FN] <TensorType(bool, matrix)>\n",
      " | | |   |Constant{0} [id T] <int64>\n",
      " | | |Subtensor{int64} [id FO] <TensorType(int64, scalar)> ''   \n",
      " | | | |Shape [id FK] <TensorType(int64, vector)> ''   \n",
      " | | | |Constant{1} [id DO] <int64>\n",
      " | | |Subtensor{int64} [id FP] <TensorType(int64, scalar)> ''   \n",
      " | |   |Shape [id FK] <TensorType(int64, vector)> ''   \n",
      " | |   |Constant{2} [id DQ] <int64>\n",
      " | |Rebroadcast{0} [id FL] <TensorType(bool, 3D)> ''   \n",
      " | |ScalarFromTensor [id FQ] <int64> ''   \n",
      " |   |Subtensor{int64} [id FJ] <TensorType(int64, scalar)> ''   \n",
      " |IncSubtensor{Set;:int64:} [id FR] <TensorType(bool, 3D)> ''   \n",
      " | |AllocEmpty{dtype='bool'} [id FS] <TensorType(bool, 3D)> ''   \n",
      " | | |Elemwise{add,no_inplace} [id FT] <TensorType(int64, scalar)> ''   \n",
      " | | | |Elemwise{minimum,no_inplace} [id B] <TensorType(int64, scalar)> ''   \n",
      " | | | |Subtensor{int64} [id FU] <TensorType(int64, scalar)> ''   \n",
      " | | |   |Shape [id FV] <TensorType(int64, vector)> ''   \n",
      " | | |   | |Rebroadcast{0} [id FW] <TensorType(bool, 3D)> ''   \n",
      " | | |   |   |InplaceDimShuffle{x,0,1} [id FX] <TensorType(bool, (True, False, False))> ''   \n",
      " | | |   |     |Elemwise{second,no_inplace} [id FY] <TensorType(bool, matrix)> ''   \n",
      " | | |   |       |mask matrix [id FN] <TensorType(bool, matrix)>\n",
      " | | |   |       |TensorConstant{(1, 1) of False} [id FZ] <TensorType(bool, (True, True))>\n",
      " | | |   |Constant{0} [id T] <int64>\n",
      " | | |Subtensor{int64} [id GA] <TensorType(int64, scalar)> ''   \n",
      " | | | |Shape [id FV] <TensorType(int64, vector)> ''   \n",
      " | | | |Constant{1} [id DO] <int64>\n",
      " | | |Subtensor{int64} [id GB] <TensorType(int64, scalar)> ''   \n",
      " | |   |Shape [id FV] <TensorType(int64, vector)> ''   \n",
      " | |   |Constant{2} [id DQ] <int64>\n",
      " | |Rebroadcast{0} [id FW] <TensorType(bool, 3D)> ''   \n",
      " | |ScalarFromTensor [id GC] <int64> ''   \n",
      " |   |Subtensor{int64} [id FU] <TensorType(int64, scalar)> ''   \n",
      " |IncSubtensor{Set;:int64:} [id GD] <TensorType(float64, 4D)> ''   \n",
      " | |AllocEmpty{dtype='float64'} [id GE] <TensorType(float64, 4D)> ''   \n",
      " | | |Elemwise{add,no_inplace} [id GF] <TensorType(int64, scalar)> ''   \n",
      " | | | |Elemwise{minimum,no_inplace} [id B] <TensorType(int64, scalar)> ''   \n",
      " | | | |Subtensor{int64} [id GG] <TensorType(int64, scalar)> ''   \n",
      " | | |   |Shape [id GH] <TensorType(int64, vector)> ''   \n",
      " | | |   | |Rebroadcast{0} [id GI] <TensorType(float64, 4D)> ''   \n",
      " | | |   |   |InplaceDimShuffle{x,0,1,2} [id GJ] <TensorType(float64, (True, False, False, False))> ''   \n",
      " | | |   |     |Elemwise{second,no_inplace} [id GK] <TensorType(float64, 3D)> ''   \n",
      " | | |   |       |block matrix [id DM] <TensorType(float64, 3D)>\n",
      " | | |   |       |TensorConstant{(1, 1, 1) of 0.0} [id GL] <TensorType(float64, (True, True, True))>\n",
      " | | |   |Constant{0} [id T] <int64>\n",
      " | | |Subtensor{int64} [id GM] <TensorType(int64, scalar)> ''   \n",
      " | | | |Shape [id GH] <TensorType(int64, vector)> ''   \n",
      " | | | |Constant{1} [id DO] <int64>\n",
      " | | |Subtensor{int64} [id GN] <TensorType(int64, scalar)> ''   \n",
      " | | | |Shape [id GH] <TensorType(int64, vector)> ''   \n",
      " | | | |Constant{2} [id DQ] <int64>\n",
      " | | |Subtensor{int64} [id GO] <TensorType(int64, scalar)> ''   \n",
      " | |   |Shape [id GH] <TensorType(int64, vector)> ''   \n",
      " | |   |Constant{3} [id DS] <int64>\n",
      " | |Rebroadcast{0} [id GI] <TensorType(float64, 4D)> ''   \n",
      " | |ScalarFromTensor [id GP] <int64> ''   \n",
      " |   |Subtensor{int64} [id GG] <TensorType(int64, scalar)> ''   \n",
      " |IncSubtensor{Set;:int64:} [id GQ] <TensorType(int64, vector)> ''   \n",
      " | |AllocEmpty{dtype='int64'} [id GR] <TensorType(int64, vector)> ''   \n",
      " | | |Elemwise{add,no_inplace} [id GS] <TensorType(int64, scalar)> ''   \n",
      " | |   |Elemwise{minimum,no_inplace} [id B] <TensorType(int64, scalar)> ''   \n",
      " | |   |TensorConstant{1} [id GT] <TensorType(int64, scalar)>\n",
      " | |TensorConstant{(1,) of 0} [id GU] <TensorType(int64, vector)>\n",
      " | |Constant{1} [id DO] <int64>\n",
      " |Number of points per surface used to split rest-ref [id GV] <TensorType(int32, vector)>\n",
      " |fault relation matrix [id GW] <TensorType(int32, matrix)>\n",
      " |<TensorType(float64, scalar)> [id GX] <TensorType(float64, scalar)>\n",
      " |<TensorType(float64, scalar)> [id GY] <TensorType(float64, scalar)>\n",
      " |Range [id GZ] <TensorType(float64, scalar)>\n",
      " |Covariance at 0 [id HA] <TensorType(float64, scalar)>\n",
      " |<TensorType(float64, scalar)> [id HB] <TensorType(float64, scalar)>\n",
      " |Nugget effect of gradients [id HC] <TensorType(float64, vector)>\n",
      " |Nugget effect of scalar [id HD] <TensorType(float64, vector)>\n",
      " |Attenuation factor [id HE] <TensorType(float64, scalar)>\n",
      " |Sigmoid Outside [id HF] <TensorType(float64, scalar)>\n",
      " |Sigmoid slope [id HG] <TensorType(float64, scalar)>\n",
      " |<TensorType(int32, vector)> [id CL] <TensorType(int32, vector)>\n",
      " |<TensorType(bool, vector)> [id HH] <TensorType(bool, vector)>\n",
      " |<TensorType(int32, vector)> [id CH] <TensorType(int32, vector)>\n",
      " |Coordinates of the grid points to interpolate [id HI] <TensorType(float64, matrix)>\n",
      " |All the surface_points points at once [id HJ] <TensorType(float64, matrix)>\n",
      " |Position of the dips [id HK] <TensorType(float64, matrix)>\n",
      " |Angle of every dip [id HL] <TensorType(float64, vector)>\n",
      " |Azimuth [id HM] <TensorType(float64, vector)>\n",
      " |Polarity [id HN] <TensorType(float64, vector)>\n",
      " |Values that the blocks are taking [id HO] <TensorType(float64, matrix)>\n",
      "for{cpu,Looping}.1 [id A] <TensorType(float64, matrix)> ''   \n",
      "for{cpu,Looping}.2 [id A] <TensorType(float64, 3D)> ''   \n",
      "for{cpu,Looping}.3 [id A] <TensorType(float64, 3D)> ''   \n",
      "for{cpu,Looping}.4 [id A] <TensorType(bool, 3D)> ''   \n",
      "for{cpu,Looping}.5 [id A] <TensorType(bool, 3D)> ''   \n",
      "for{cpu,Looping}.6 [id A] <TensorType(float64, 4D)> ''   \n",
      "for{cpu,Looping}.7 [id A] <TensorType(int64, vector)> ''   \n",
      "\n",
      "Inner graphs of the scan ops:\n",
      "\n",
      "for{cpu,Looping}.0 [id A] <TensorType(float64, 4D)> ''   \n",
      " >IncSubtensor{Set;int32, ::, int8:int64:} [id HP] <TensorType(float64, 3D)> ''   \n",
      " > |block matrix[t-1] [id HQ] <TensorType(float64, 3D)> -> [id DF]\n",
      " > |if{} [id HR] <TensorType(float64, matrix)> ''   \n",
      " > | |Vector controlling if block matrix must be recomputed[t] [id HS] <TensorType(bool, scalar)> -> [id CZ]\n",
      " > | |if{} [id HT] <TensorType(float64, matrix)> ''   \n",
      " > | | |The series (fault) is finite[t] [id HU] <TensorType(int32, scalar)> -> [id DA]\n",
      " > | | |Sum{axis=[0], acc_dtype=float64} [id HV] <TensorType(float64, matrix)> 'The chunk of block model of a specific series'   \n",
      " > | | |Sum{axis=[0], acc_dtype=float64} [id HW] <TensorType(float64, matrix)> 'The chunk of block model of a specific series'   \n",
      " > | |Subtensor{int32, ::} [id HX] <TensorType(float64, matrix)> ''   \n",
      " > |   |block matrix[t-1] [id HQ] <TensorType(float64, 3D)> -> [id DF]\n",
      " > |   |ScalarFromTensor [id HY] <int32> ''   \n",
      " > |     |<TensorType(int32, scalar)> [id HZ] <TensorType(int32, scalar)> -> [id DD]\n",
      " > |ScalarFromTensor [id HY] <int32> ''   \n",
      " > |Constant{0} [id IA] <int8>\n",
      " > |ScalarFromTensor [id IB] <int64> ''   \n",
      " >   |Elemwise{add,no_inplace} [id IC] <TensorType(int64, scalar)> ''   \n",
      " >     |Elemwise{add,no_inplace} [id ID] <TensorType(int64, scalar)> ''   \n",
      " >     | |Subtensor{int64} [id IE] <TensorType(int64, scalar)> ''   \n",
      " >     | | |Shape [id IF] <TensorType(int64, vector)> ''   \n",
      " >     | | | |Coordinates of the grid points to interpolate_copy [id IG] <TensorType(float64, matrix)> -> [id HI]\n",
      " >     | | |Constant{0} [id IH] <int64>\n",
      " >     | |Elemwise{mul,no_inplace} [id II] <TensorType(int64, scalar)> ''   \n",
      " >     |   |TensorConstant{2} [id IJ] <TensorType(int8, scalar)>\n",
      " >     |   |Elemwise{sub,no_inplace} [id IK] <TensorType(int64, scalar)> ''   \n",
      " >     |     |Subtensor{int64} [id IL] <TensorType(int64, scalar)> ''   \n",
      " >     |     | |Shape [id IM] <TensorType(int64, vector)> ''   \n",
      " >     |     | | |All the surface_points points at once_copy [id IN] <TensorType(float64, matrix)> -> [id HJ]\n",
      " >     |     | |Constant{0} [id IH] <int64>\n",
      " >     |     |Subtensor{int64} [id IO] <TensorType(int64, scalar)> ''   \n",
      " >     |       |Shape [id IP] <TensorType(int64, vector)> ''   \n",
      " >     |       | |Number of points per surface used to split rest-ref_copy [id IQ] <TensorType(int32, vector)> -> [id GV]\n",
      " >     |       |Constant{0} [id IH] <int64>\n",
      " >     |TensorConstant{0} [id IR] <TensorType(int8, scalar)>\n",
      " >IncSubtensor{Set;int32:int32:} [id IS] <TensorType(float64, vector)> ''   \n",
      " > |Weights vector[t-1] [id IT] <TensorType(float64, vector)> -> [id DU]\n",
      " > |if{} [id IU] <TensorType(float64, vector)> ''   \n",
      " > | |Vector controlling if weights must be recomputed[t] [id IV] <TensorType(bool, scalar)> -> [id CX]\n",
      " > | |Reshape{1} [id IW] <TensorType(float64, vector)> 'Dual Kriging parameters'   \n",
      " > | |Subtensor{int32:int32:} [id IX] <TensorType(float64, vector)> ''   \n",
      " > |   |Weights vector[t-1] [id IT] <TensorType(float64, vector)> -> [id DU]\n",
      " > |   |ScalarFromTensor [id IY] <int32> ''   \n",
      " > |   | |Length of weights in every series[t] [id IZ] <TensorType(int32, scalar)> -> [id CS]\n",
      " > |   |ScalarFromTensor [id JA] <int32> ''   \n",
      " > |     |Length of weights in every series[t+1] [id JB] <TensorType(int32, scalar)> -> [id CT]\n",
      " > |ScalarFromTensor [id IY] <int32> ''   \n",
      " > |ScalarFromTensor [id JA] <int32> ''   \n",
      " >IncSubtensor{Set;int32, int8:int64:} [id JC] <TensorType(float64, matrix)> ''   \n",
      " > |Scalar matrix[t-1] [id JD] <TensorType(float64, matrix)> -> [id EE]\n",
      " > |if{} [id JE] <TensorType(float64, vector)> ''   \n",
      " > | |Vector controlling if scalar matrix must be recomputed[t] [id JF] <TensorType(bool, scalar)> -> [id CY]\n",
      " > | |Subtensor{int64} [id JG] <TensorType(float64, vector)> 'Value of the potential field at every point'   \n",
      " > | |Subtensor{int32} [id JH] <TensorType(float64, vector)> ''   \n",
      " > |   |Scalar matrix[t-1] [id JD] <TensorType(float64, matrix)> -> [id EE]\n",
      " > |   |ScalarFromTensor [id HY] <int32> ''   \n",
      " > |ScalarFromTensor [id HY] <int32> ''   \n",
      " > |Constant{0} [id IA] <int8>\n",
      " > |ScalarFromTensor [id IB] <int64> ''   \n",
      " >AdvancedIncSubtensor{inplace=False,  set_instead_of_inc=True} [id JI] <TensorType(float64, matrix)> ''   \n",
      " > |<TensorType(float64, matrix)> [id JJ] <TensorType(float64, matrix)> -> [id EP]\n",
      " > |AdvancedSubtensor1 [id JK] <TensorType(float64, vector)> ''   \n",
      " > | |Subtensor{int64:int64:} [id JL] <TensorType(float64, vector)> ''   \n",
      " > | | |if{} [id JE] <TensorType(float64, vector)> ''   \n",
      " > | | |ScalarFromTensor [id JM] <int64> ''   \n",
      " > | | | |Elemwise{mul,no_inplace} [id JN] <TensorType(int64, scalar)> ''   \n",
      " > | | |   |TensorConstant{-2} [id JO] <TensorType(int8, scalar)>\n",
      " > | | |   |Elemwise{sub,no_inplace} [id IK] <TensorType(int64, scalar)> ''   \n",
      " > | | |ScalarFromTensor [id JP] <int64> ''   \n",
      " > | |   |Elemwise{neg,no_inplace} [id JQ] <TensorType(int64, scalar)> ''   \n",
      " > | |     |Elemwise{sub,no_inplace} [id IK] <TensorType(int64, scalar)> ''   \n",
      " > | |Subtensor{int32:int32:} [id JR] <TensorType(int32, vector)> ''   \n",
      " > |   |CumOp{None, add} [id JS] <TensorType(int32, vector)> 'Number of points per surfaces after rest-ref. This is used for finding the differentsurface points withing a layer.'   \n",
      " > |   |ScalarFromTensor [id JT] <int32> ''   \n",
      " > |   | |List with the number of surfaces[t] [id JU] <TensorType(int32, scalar)> -> [id CU]\n",
      " > |   |ScalarFromTensor [id JV] <int32> ''   \n",
      " > |     |List with the number of surfaces[t+1] [id JW] <TensorType(int32, scalar)> -> [id CV]\n",
      " > |<TensorType(int32, scalar)> [id HZ] <TensorType(int32, scalar)> -> [id DD]\n",
      " > |Elemwise{sub,no_inplace} [id JX] <TensorType(int32, vector)> ''   \n",
      " >   |Subtensor{int32:int32:} [id JY] <TensorType(int32, vector)> ''   \n",
      " >   | |TensorConstant{[   1    2..4998 4999]} [id JZ] <TensorType(int32, vector)>\n",
      " >   | |ScalarFromTensor [id JT] <int32> ''   \n",
      " >   | |ScalarFromTensor [id JV] <int32> ''   \n",
      " >   |TensorConstant{(1,) of 1} [id KA] <TensorType(int8, (True,))>\n",
      " >IncSubtensor{Set;int32, int8:int64:} [id KB] <TensorType(bool, matrix)> ''   \n",
      " > |IncSubtensor{Set;int64:int32:, int8:int64:} [id KC] <TensorType(bool, matrix)> ''   \n",
      " > | |IncSubtensor{Set;int32:int32:, int8:int64:} [id KD] <TensorType(bool, matrix)> ''   \n",
      " > | | |mask matrix[t-1] [id KE] <TensorType(bool, matrix)> -> [id FG]\n",
      " > | | |if{} [id KF] <TensorType(bool, vector)> ''   \n",
      " > | | | |<TensorType(int32, scalar)> [id KG] <TensorType(int32, scalar)> -> [id DC]\n",
      " > | | | |Elemwise{gt,no_inplace} [id KH] <TensorType(bool, vector)> ''   \n",
      " > | | | | |if{} [id JE] <TensorType(float64, vector)> ''   \n",
      " > | | | | |InplaceDimShuffle{x} [id KI] <TensorType(float64, (True,))> ''   \n",
      " > | | | |   |MaxAndArgmax{axis=(0,)}.0 [id KJ] <TensorType(float64, scalar)> 'max'   \n",
      " > | | | |Subtensor{int32, int8:int64:} [id KK] <TensorType(bool, vector)> ''   \n",
      " > | | |   |mask matrix[t-1] [id KE] <TensorType(bool, matrix)> -> [id FG]\n",
      " > | | |   |ScalarFromTensor [id KL] <int32> ''   \n",
      " > | | |   | |Elemwise{sub,no_inplace} [id KM] <TensorType(int32, scalar)> ''   \n",
      " > | | |   |   |<TensorType(int32, scalar)> [id HZ] <TensorType(int32, scalar)> -> [id DD]\n",
      " > | | |   |   |TensorConstant{1} [id KN] <TensorType(int8, scalar)>\n",
      " > | | |   |Constant{0} [id IA] <int8>\n",
      " > | | |   |ScalarFromTensor [id IB] <int64> ''   \n",
      " > | | |ScalarFromTensor [id KL] <int32> ''   \n",
      " > | | |ScalarFromTensor [id HY] <int32> ''   \n",
      " > | | |Constant{0} [id IA] <int8>\n",
      " > | | |ScalarFromTensor [id IB] <int64> ''   \n",
      " > | |Subtensor{::int64} [id KO] <TensorType(bool, matrix)> ''   \n",
      " > | | |CumOp{0, mul} [id KP] <TensorType(bool, matrix)> ''   \n",
      " > | | | |Subtensor{::int64} [id KQ] <TensorType(bool, matrix)> ''   \n",
      " > | | |   |Subtensor{int64:int32:, int8:int64:} [id KR] <TensorType(bool, matrix)> ''   \n",
      " > | | |   | |IncSubtensor{Set;int32:int32:, int8:int64:} [id KD] <TensorType(bool, matrix)> ''   \n",
      " > | | |   | |ScalarFromTensor [id KS] <int64> ''   \n",
      " > | | |   | | |Elemwise{sub,no_inplace} [id KT] <TensorType(int64, scalar)> ''   \n",
      " > | | |   | |   |<TensorType(int32, scalar)> [id HZ] <TensorType(int32, scalar)> -> [id DD]\n",
      " > | | |   | |   |Elemwise{mul,no_inplace} [id KU] <TensorType(int64, scalar)> ''   \n",
      " > | | |   | |     |Elemwise{mul,no_inplace} [id KV] <TensorType(int64, scalar)> ''   \n",
      " > | | |   | |     | |Elemwise{add,no_inplace} [id KW] <TensorType(int64, scalar)> ''   \n",
      " > | | |   | |     | | |<TensorType(int64, scalar)> [id KX] <TensorType(int64, scalar)> -> [id GQ]\n",
      " > | | |   | |     | | |Elemwise{add,no_inplace} [id KY] <TensorType(int32, scalar)> ''   \n",
      " > | | |   | |     | |   |Subtensor{int32} [id KZ] <TensorType(int32, scalar)> ''   \n",
      " > | | |   | |     | |   | |<TensorType(int32, vector)> [id LA] <TensorType(int32, vector)> -> [id CL]\n",
      " > | | |   | |     | |   | |ScalarFromTensor [id HY] <int32> ''   \n",
      " > | | |   | |     | |   |Subtensor{int32} [id LB] <TensorType(bool, scalar)> ''   \n",
      " > | | |   | |     | |     |<TensorType(bool, vector)> [id LC] <TensorType(bool, vector)> -> [id HH]\n",
      " > | | |   | |     | |     |ScalarFromTensor [id HY] <int32> ''   \n",
      " > | | |   | |     | |Elemwise{add,no_inplace} [id KY] <TensorType(int32, scalar)> ''   \n",
      " > | | |   | |     |Subtensor{int64} [id LD] <TensorType(int32, scalar)> ''   \n",
      " > | | |   | |       |<TensorType(int32, vector)> [id LA] <TensorType(int32, vector)> -> [id CL]\n",
      " > | | |   | |       |ScalarFromTensor [id LE] <int64> ''   \n",
      " > | | |   | |         |Elemwise{sub,no_inplace} [id LF] <TensorType(int64, scalar)> ''   \n",
      " > | | |   | |           |<TensorType(int32, scalar)> [id HZ] <TensorType(int32, scalar)> -> [id DD]\n",
      " > | | |   | |           |<TensorType(int64, scalar)> [id KX] <TensorType(int64, scalar)> -> [id GQ]\n",
      " > | | |   | |ScalarFromTensor [id HY] <int32> ''   \n",
      " > | | |   | |Constant{0} [id IA] <int8>\n",
      " > | | |   | |ScalarFromTensor [id IB] <int64> ''   \n",
      " > | | |   |Constant{-1} [id LG] <int64>\n",
      " > | | |Constant{-1} [id LG] <int64>\n",
      " > | |ScalarFromTensor [id KS] <int64> ''   \n",
      " > | |ScalarFromTensor [id HY] <int32> ''   \n",
      " > | |Constant{0} [id IA] <int8>\n",
      " > | |ScalarFromTensor [id IB] <int64> ''   \n",
      " > |if{} [id LH] <TensorType(bool, vector)> ''   \n",
      " > | |<TensorType(int32, scalar)> [id LI] <TensorType(int32, scalar)> -> [id DB]\n",
      " > | |Elemwise{gt,no_inplace} [id LJ] <TensorType(bool, vector)> ''   \n",
      " > | | |if{} [id JE] <TensorType(float64, vector)> ''   \n",
      " > | | |InplaceDimShuffle{x} [id LK] <TensorType(float64, (True,))> ''   \n",
      " > | |   |Elemwise{neg,no_inplace} [id LL] <TensorType(float64, scalar)> ''   \n",
      " > | |     |MaxAndArgmax{axis=(0,)}.0 [id LM] <TensorType(float64, scalar)> 'max'   \n",
      " > | |Elemwise{mul,no_inplace} [id LN] <TensorType(bool, vector)> ''   \n",
      " > |   |InplaceDimShuffle{x} [id LO] <TensorType(bool, (True,))> ''   \n",
      " > |   | |Elemwise{invert,no_inplace} [id LP] <TensorType(bool, scalar)> ''   \n",
      " > |   |   |Subtensor{int32} [id LB] <TensorType(bool, scalar)> ''   \n",
      " > |   |Elemwise{second,no_inplace} [id LQ] <TensorType(bool, vector)> ''   \n",
      " > |     |if{} [id JE] <TensorType(float64, vector)> ''   \n",
      " > |     |TensorConstant{(1,) of True} [id LR] <TensorType(bool, (True,))>\n",
      " > |ScalarFromTensor [id HY] <int32> ''   \n",
      " > |Constant{0} [id IA] <int8>\n",
      " > |ScalarFromTensor [id IB] <int64> ''   \n",
      " >AdvancedBooleanIncSubtensor{inplace=False,  set_instead_of_inc=True} [id LS] <TensorType(bool, matrix)> ''   \n",
      " > |<TensorType(bool, matrix)> [id LT] <TensorType(bool, matrix)> -> [id FR]\n",
      " > |Elemwise{add,no_inplace} [id LU] <TensorType(bool, vector)> ''   \n",
      " > | |if{} [id LH] <TensorType(bool, vector)> ''   \n",
      " > | |if{} [id LV] <TensorType(bool, vector)> ''   \n",
      " > |   |Subtensor{int32} [id LB] <TensorType(bool, scalar)> ''   \n",
      " > |   |Elemwise{gt,no_inplace} [id LJ] <TensorType(bool, vector)> ''   \n",
      " > |   |Elemwise{second,no_inplace} [id LW] <TensorType(bool, vector)> ''   \n",
      " > |     |if{} [id JE] <TensorType(float64, vector)> ''   \n",
      " > |     |TensorConstant{(1,) of False} [id LX] <TensorType(bool, (True,))>\n",
      " > |Elemwise{mul,no_inplace} [id LY] <TensorType(bool, vector)> ''   \n",
      " > | |Subtensor{:int64:} [id LZ] <TensorType(bool, vector)> ''   \n",
      " > | | |<TensorType(bool, vector)> [id LC] <TensorType(bool, vector)> -> [id HH]\n",
      " > | | |ScalarFromTensor [id MA] <int64> ''   \n",
      " > | |   |Subtensor{int64} [id MB] <TensorType(int64, scalar)> ''   \n",
      " > | |     |Shape [id MC] <TensorType(int64, vector)> ''   \n",
      " > | |     | |<TensorType(int32, vector)> [id MD] <TensorType(int32, vector)> -> [id CH]\n",
      " > | |     |Constant{0} [id IH] <int64>\n",
      " > | |Elemwise{invert,no_inplace} [id ME] <TensorType(bool, vector)> ''   \n",
      " > |   |Elemwise{Cast{bool}} [id MF] <TensorType(bool, vector)> ''   \n",
      " > |     |Subtensor{:int64:} [id MG] <TensorType(int32, vector)> ''   \n",
      " > |       |Subtensor{::, int8} [id MH] <TensorType(int32, vector)> ''   \n",
      " > |       | |fault relation matrix_copy [id MI] <TensorType(int32, matrix)> -> [id GW]\n",
      " > |       | |ScalarFromTensor [id MJ] <int8> ''   \n",
      " > |       |   |Elemwise{Cast{int8}} [id MK] <TensorType(int8, scalar)> ''   \n",
      " > |       |     |<TensorType(int32, scalar)> [id HZ] <TensorType(int32, scalar)> -> [id DD]\n",
      " > |       |ScalarFromTensor [id MA] <int64> ''   \n",
      " > |MakeSlice [id ML] <slice> ''   \n",
      " >   |TensorConstant{0} [id IR] <TensorType(int8, scalar)>\n",
      " >   |Elemwise{add,no_inplace} [id IC] <TensorType(int64, scalar)> ''   \n",
      " >   |NoneConst [id MM] <NoneTypeT>\n",
      " >IncSubtensor{Set;int32, ::, int8:int64:} [id MN] <TensorType(float64, 3D)> ''   \n",
      " > |<TensorType(float64, 3D)> [id MO] <TensorType(float64, 3D)> -> [id GD]\n",
      " > |if{} [id HR] <TensorType(float64, matrix)> ''   \n",
      " > |ScalarFromTensor [id HY] <int32> ''   \n",
      " > |Constant{0} [id IA] <int8>\n",
      " > |ScalarFromTensor [id IB] <int64> ''   \n",
      " >Elemwise{mul,no_inplace} [id KU] <TensorType(int64, scalar)> ''   \n",
      "\n",
      "for{cpu,Looping}.1 [id A] <TensorType(float64, matrix)> ''   \n",
      " >IncSubtensor{Set;int32, ::, int8:int64:} [id HP] <TensorType(float64, 3D)> ''   \n",
      " >IncSubtensor{Set;int32:int32:} [id IS] <TensorType(float64, vector)> ''   \n",
      " >IncSubtensor{Set;int32, int8:int64:} [id JC] <TensorType(float64, matrix)> ''   \n",
      " >AdvancedIncSubtensor{inplace=False,  set_instead_of_inc=True} [id JI] <TensorType(float64, matrix)> ''   \n",
      " >IncSubtensor{Set;int32, int8:int64:} [id KB] <TensorType(bool, matrix)> ''   \n",
      " >AdvancedBooleanIncSubtensor{inplace=False,  set_instead_of_inc=True} [id LS] <TensorType(bool, matrix)> ''   \n",
      " >IncSubtensor{Set;int32, ::, int8:int64:} [id MN] <TensorType(float64, 3D)> ''   \n",
      " >Elemwise{mul,no_inplace} [id KU] <TensorType(int64, scalar)> ''   \n",
      "\n",
      "for{cpu,Looping}.2 [id A] <TensorType(float64, 3D)> ''   \n",
      " >IncSubtensor{Set;int32, ::, int8:int64:} [id HP] <TensorType(float64, 3D)> ''   \n",
      " >IncSubtensor{Set;int32:int32:} [id IS] <TensorType(float64, vector)> ''   \n",
      " >IncSubtensor{Set;int32, int8:int64:} [id JC] <TensorType(float64, matrix)> ''   \n",
      " >AdvancedIncSubtensor{inplace=False,  set_instead_of_inc=True} [id JI] <TensorType(float64, matrix)> ''   \n",
      " >IncSubtensor{Set;int32, int8:int64:} [id KB] <TensorType(bool, matrix)> ''   \n",
      " >AdvancedBooleanIncSubtensor{inplace=False,  set_instead_of_inc=True} [id LS] <TensorType(bool, matrix)> ''   \n",
      " >IncSubtensor{Set;int32, ::, int8:int64:} [id MN] <TensorType(float64, 3D)> ''   \n",
      " >Elemwise{mul,no_inplace} [id KU] <TensorType(int64, scalar)> ''   \n",
      "\n",
      "for{cpu,Looping}.3 [id A] <TensorType(float64, 3D)> ''   \n",
      " >IncSubtensor{Set;int32, ::, int8:int64:} [id HP] <TensorType(float64, 3D)> ''   \n",
      " >IncSubtensor{Set;int32:int32:} [id IS] <TensorType(float64, vector)> ''   \n",
      " >IncSubtensor{Set;int32, int8:int64:} [id JC] <TensorType(float64, matrix)> ''   \n",
      " >AdvancedIncSubtensor{inplace=False,  set_instead_of_inc=True} [id JI] <TensorType(float64, matrix)> ''   \n",
      " >IncSubtensor{Set;int32, int8:int64:} [id KB] <TensorType(bool, matrix)> ''   \n",
      " >AdvancedBooleanIncSubtensor{inplace=False,  set_instead_of_inc=True} [id LS] <TensorType(bool, matrix)> ''   \n",
      " >IncSubtensor{Set;int32, ::, int8:int64:} [id MN] <TensorType(float64, 3D)> ''   \n",
      " >Elemwise{mul,no_inplace} [id KU] <TensorType(int64, scalar)> ''   \n",
      "\n",
      "for{cpu,Looping}.4 [id A] <TensorType(bool, 3D)> ''   \n",
      " >IncSubtensor{Set;int32, ::, int8:int64:} [id HP] <TensorType(float64, 3D)> ''   \n",
      " >IncSubtensor{Set;int32:int32:} [id IS] <TensorType(float64, vector)> ''   \n",
      " >IncSubtensor{Set;int32, int8:int64:} [id JC] <TensorType(float64, matrix)> ''   \n",
      " >AdvancedIncSubtensor{inplace=False,  set_instead_of_inc=True} [id JI] <TensorType(float64, matrix)> ''   \n",
      " >IncSubtensor{Set;int32, int8:int64:} [id KB] <TensorType(bool, matrix)> ''   \n",
      " >AdvancedBooleanIncSubtensor{inplace=False,  set_instead_of_inc=True} [id LS] <TensorType(bool, matrix)> ''   \n",
      " >IncSubtensor{Set;int32, ::, int8:int64:} [id MN] <TensorType(float64, 3D)> ''   \n",
      " >Elemwise{mul,no_inplace} [id KU] <TensorType(int64, scalar)> ''   \n",
      "\n",
      "for{cpu,Looping}.5 [id A] <TensorType(bool, 3D)> ''   \n",
      " >IncSubtensor{Set;int32, ::, int8:int64:} [id HP] <TensorType(float64, 3D)> ''   \n",
      " >IncSubtensor{Set;int32:int32:} [id IS] <TensorType(float64, vector)> ''   \n",
      " >IncSubtensor{Set;int32, int8:int64:} [id JC] <TensorType(float64, matrix)> ''   \n",
      " >AdvancedIncSubtensor{inplace=False,  set_instead_of_inc=True} [id JI] <TensorType(float64, matrix)> ''   \n",
      " >IncSubtensor{Set;int32, int8:int64:} [id KB] <TensorType(bool, matrix)> ''   \n",
      " >AdvancedBooleanIncSubtensor{inplace=False,  set_instead_of_inc=True} [id LS] <TensorType(bool, matrix)> ''   \n",
      " >IncSubtensor{Set;int32, ::, int8:int64:} [id MN] <TensorType(float64, 3D)> ''   \n",
      " >Elemwise{mul,no_inplace} [id KU] <TensorType(int64, scalar)> ''   \n",
      "\n",
      "for{cpu,Looping}.6 [id A] <TensorType(float64, 4D)> ''   \n",
      " >IncSubtensor{Set;int32, ::, int8:int64:} [id HP] <TensorType(float64, 3D)> ''   \n",
      " >IncSubtensor{Set;int32:int32:} [id IS] <TensorType(float64, vector)> ''   \n",
      " >IncSubtensor{Set;int32, int8:int64:} [id JC] <TensorType(float64, matrix)> ''   \n",
      " >AdvancedIncSubtensor{inplace=False,  set_instead_of_inc=True} [id JI] <TensorType(float64, matrix)> ''   \n",
      " >IncSubtensor{Set;int32, int8:int64:} [id KB] <TensorType(bool, matrix)> ''   \n",
      " >AdvancedBooleanIncSubtensor{inplace=False,  set_instead_of_inc=True} [id LS] <TensorType(bool, matrix)> ''   \n",
      " >IncSubtensor{Set;int32, ::, int8:int64:} [id MN] <TensorType(float64, 3D)> ''   \n",
      " >Elemwise{mul,no_inplace} [id KU] <TensorType(int64, scalar)> ''   \n",
      "\n",
      "for{cpu,Looping}.7 [id A] <TensorType(int64, vector)> ''   \n",
      " >IncSubtensor{Set;int32, ::, int8:int64:} [id HP] <TensorType(float64, 3D)> ''   \n",
      " >IncSubtensor{Set;int32:int32:} [id IS] <TensorType(float64, vector)> ''   \n",
      " >IncSubtensor{Set;int32, int8:int64:} [id JC] <TensorType(float64, matrix)> ''   \n",
      " >AdvancedIncSubtensor{inplace=False,  set_instead_of_inc=True} [id JI] <TensorType(float64, matrix)> ''   \n",
      " >IncSubtensor{Set;int32, int8:int64:} [id KB] <TensorType(bool, matrix)> ''   \n",
      " >AdvancedBooleanIncSubtensor{inplace=False,  set_instead_of_inc=True} [id LS] <TensorType(bool, matrix)> ''   \n",
      " >IncSubtensor{Set;int32, ::, int8:int64:} [id MN] <TensorType(float64, 3D)> ''   \n",
      " >Elemwise{mul,no_inplace} [id KU] <TensorType(int64, scalar)> ''   \n",
      "\n",
      "Storage map footprint:\n",
      " - Coordinates of the grid points to interpolate, Input, Shape: (125000, 3), ElemSize: 8 Byte(s), TotalSize: 3000000 Byte(s)\n",
      " - IncSubtensor{Set;:int64:}.0, Shape: (2, 1, 1, 125002), ElemSize: 8 Byte(s), TotalSize: 2000032 Byte(s)\n",
      " - IncSubtensor{Set;:int64:}.0, Shape: (2, 1, 125002), ElemSize: 8 Byte(s), TotalSize: 2000032 Byte(s)\n",
      " - IncSubtensor{Set;:int64:}.0, Shape: (2, 1, 1, 125002), ElemSize: 8 Byte(s), TotalSize: 2000032 Byte(s)\n",
      " - for{cpu,Looping}.0, Shape: (2, 1, 1, 125002), ElemSize: 8 Byte(s), TotalSize: 2000032 Byte(s)\n",
      " - for{cpu,Looping}.2, Shape: (2, 1, 125002), ElemSize: 8 Byte(s), TotalSize: 2000032 Byte(s)\n",
      " - for{cpu,Looping}.6, Shape: (2, 1, 1, 125002), ElemSize: 8 Byte(s), TotalSize: 2000032 Byte(s)\n",
      " - block matrix, Shared Input, Shape: (1, 1, 125002), ElemSize: 8 Byte(s), TotalSize: 1000016 Byte(s)\n",
      " - Scalar matrix, Shared Input, Shape: (1, 125002), ElemSize: 8 Byte(s), TotalSize: 1000016 Byte(s)\n",
      " - IncSubtensor{Set;:int64:}.0, Shape: (2, 1, 125002), ElemSize: 1 Byte(s), TotalSize: 250004 Byte(s)\n",
      " - IncSubtensor{Set;:int64:}.0, Shape: (2, 1, 125002), ElemSize: 1 Byte(s), TotalSize: 250004 Byte(s)\n",
      " - for{cpu,Looping}.4, Shape: (2, 1, 125002), ElemSize: 1 Byte(s), TotalSize: 250004 Byte(s)\n",
      " - for{cpu,Looping}.5, Shape: (2, 1, 125002), ElemSize: 1 Byte(s), TotalSize: 250004 Byte(s)\n",
      " - mask matrix, Shared Input, Shape: (1, 125002), ElemSize: 1 Byte(s), TotalSize: 125002 Byte(s)\n",
      " - TensorConstant{[   0    1..4998 4999]}, Shape: (5000,), ElemSize: 4 Byte(s), TotalSize: 20000 Byte(s)\n",
      " - Vector controlling if weights must be recomputed, Input, Shape: (1000,), ElemSize: 1 Byte(s), TotalSize: 1000 Byte(s)\n",
      " - Vector controlling if scalar matrix must be recomputed, Input, Shape: (1000,), ElemSize: 1 Byte(s), TotalSize: 1000 Byte(s)\n",
      " - Vector controlling if block matrix must be recomputed, Input, Shape: (1000,), ElemSize: 1 Byte(s), TotalSize: 1000 Byte(s)\n",
      " - IncSubtensor{Set;:int64:}.0, Shape: (2, 10), ElemSize: 8 Byte(s), TotalSize: 160 Byte(s)\n",
      " - for{cpu,Looping}.1, Shape: (2, 10), ElemSize: 8 Byte(s), TotalSize: 160 Byte(s)\n",
      " - All the surface_points points at once, Input, Shape: (4, 3), ElemSize: 8 Byte(s), TotalSize: 96 Byte(s)\n",
      " - Weights vector, Shared Input, Shape: (10,), ElemSize: 8 Byte(s), TotalSize: 80 Byte(s)\n",
      " - Position of the dips, Input, Shape: (2, 3), ElemSize: 8 Byte(s), TotalSize: 48 Byte(s)\n",
      " - Nugget effect of gradients, Shared Input, Shape: (6,), ElemSize: 8 Byte(s), TotalSize: 48 Byte(s)\n",
      " - Nugget effect of scalar, Shared Input, Shape: (4,), ElemSize: 8 Byte(s), TotalSize: 32 Byte(s)\n",
      " - Values that the blocks are taking, Input, Shape: (1, 3), ElemSize: 8 Byte(s), TotalSize: 24 Byte(s)\n",
      " - Angle of every dip, Input, Shape: (2,), ElemSize: 8 Byte(s), TotalSize: 16 Byte(s)\n",
      " - Azimuth, Input, Shape: (2,), ElemSize: 8 Byte(s), TotalSize: 16 Byte(s)\n",
      " - Polarity, Input, Shape: (2,), ElemSize: 8 Byte(s), TotalSize: 16 Byte(s)\n",
      " - IncSubtensor{Set;:int64:}.0, Shape: (2,), ElemSize: 8 Byte(s), TotalSize: 16 Byte(s)\n",
      " - IncSubtensor{Set;:int64:}.0, Shape: (2, 1, 1), ElemSize: 8 Byte(s), TotalSize: 16 Byte(s)\n",
      " - for{cpu,Looping}.3, Shape: (2, 1, 1), ElemSize: 8 Byte(s), TotalSize: 16 Byte(s)\n",
      " - for{cpu,Looping}.7, Shape: (2,), ElemSize: 8 Byte(s), TotalSize: 16 Byte(s)\n",
      " - Length of surface_points in every series, Shared Input, Shape: (2,), ElemSize: 4 Byte(s), TotalSize: 8 Byte(s)\n",
      " - Length of foliations in every series, Shared Input, Shape: (2,), ElemSize: 4 Byte(s), TotalSize: 8 Byte(s)\n",
      " - Length of weights in every series, Shared Input, Shape: (2,), ElemSize: 4 Byte(s), TotalSize: 8 Byte(s)\n",
      " - List with the number of surfaces, Shared Input, Shape: (2,), ElemSize: 4 Byte(s), TotalSize: 8 Byte(s)\n",
      " - The series (fault) is finite, Shared Input, Shape: (2,), ElemSize: 4 Byte(s), TotalSize: 8 Byte(s)\n",
      " - Number of points per surface used to split rest-ref, Shared Input, Shape: (2,), ElemSize: 4 Byte(s), TotalSize: 8 Byte(s)\n",
      " - <TensorType(float64, scalar)>, Shared Input, Shape: (), ElemSize: 8 Byte(s), TotalSize: 8.0 Byte(s)\n",
      " - <TensorType(float64, scalar)>, Shared Input, Shape: (), ElemSize: 8 Byte(s), TotalSize: 8.0 Byte(s)\n",
      " - Range, Shared Input, Shape: (), ElemSize: 8 Byte(s), TotalSize: 8.0 Byte(s)\n",
      " - Covariance at 0, Shared Input, Shape: (), ElemSize: 8 Byte(s), TotalSize: 8.0 Byte(s)\n",
      " - <TensorType(float64, scalar)>, Shared Input, Shape: (), ElemSize: 8 Byte(s), TotalSize: 8.0 Byte(s)\n",
      " - Attenuation factor, Shared Input, Shape: (), ElemSize: 8 Byte(s), TotalSize: 8.0 Byte(s)\n",
      " - Sigmoid Outside, Shared Input, Shape: (), ElemSize: 8 Byte(s), TotalSize: 8.0 Byte(s)\n",
      " - Sigmoid slope, Shared Input, Shape: (), ElemSize: 8 Byte(s), TotalSize: 8.0 Byte(s)\n",
      " - <TensorType(float64, scalar)>, Shared Input, Shape: (), ElemSize: 8 Byte(s), TotalSize: 8.0 Byte(s)\n",
      " - Constant{0}, Shape: (), ElemSize: 8 Byte(s), TotalSize: 8.0 Byte(s)\n",
      " - Constant{1}, Shape: (), ElemSize: 8 Byte(s), TotalSize: 8.0 Byte(s)\n",
      " - Constant{-1}, Shape: (), ElemSize: 8 Byte(s), TotalSize: 8.0 Byte(s)\n",
      " - TensorConstant{5000}, Shape: (), ElemSize: 8 Byte(s), TotalSize: 8.0 Byte(s)\n",
      " - Elemwise{minimum,no_inplace}.0, Shape: (), ElemSize: 8 Byte(s), TotalSize: 8.0 Byte(s)\n",
      " - TensorConstant{1}, Shape: (), ElemSize: 8 Byte(s), TotalSize: 8.0 Byte(s)\n",
      " - TensorConstant{(1,) of 0}, Shape: (1,), ElemSize: 8 Byte(s), TotalSize: 8 Byte(s)\n",
      " - TensorConstant{(1, 1, 1) of 0.0}, Shape: (1, 1, 1), ElemSize: 8 Byte(s), TotalSize: 8 Byte(s)\n",
      " - Constant{3}, Shape: (), ElemSize: 8 Byte(s), TotalSize: 8.0 Byte(s)\n",
      " - Constant{2}, Shape: (), ElemSize: 8 Byte(s), TotalSize: 8.0 Byte(s)\n",
      " - TensorConstant{0.0}, Shape: (), ElemSize: 8 Byte(s), TotalSize: 8.0 Byte(s)\n",
      " - Grade of the universal drift, Shared Input, Shape: (1,), ElemSize: 4 Byte(s), TotalSize: 4 Byte(s)\n",
      " - <TensorType(int32, vector)>, Shared Input, Shape: (1,), ElemSize: 4 Byte(s), TotalSize: 4 Byte(s)\n",
      " - <TensorType(int32, vector)>, Shared Input, Shape: (1,), ElemSize: 4 Byte(s), TotalSize: 4 Byte(s)\n",
      " - fault relation matrix, Shared Input, Shape: (1, 1), ElemSize: 4 Byte(s), TotalSize: 4 Byte(s)\n",
      " - Subtensor{:int64:}.0, Shape: (1,), ElemSize: 4 Byte(s), TotalSize: 4 Byte(s)\n",
      " - Subtensor{:int64:}.0, Shape: (1,), ElemSize: 4 Byte(s), TotalSize: 4 Byte(s)\n",
      " - Subtensor{:int64:}.0, Shape: (1,), ElemSize: 4 Byte(s), TotalSize: 4 Byte(s)\n",
      " - Subtensor{:int64:}.0, Shape: (1,), ElemSize: 4 Byte(s), TotalSize: 4 Byte(s)\n",
      " - Subtensor{:int64:}.0, Shape: (1,), ElemSize: 4 Byte(s), TotalSize: 4 Byte(s)\n",
      " - Subtensor{:int64:}.0, Shape: (1,), ElemSize: 4 Byte(s), TotalSize: 4 Byte(s)\n",
      " - Subtensor{:int64:}.0, Shape: (1,), ElemSize: 4 Byte(s), TotalSize: 4 Byte(s)\n",
      " - Subtensor{:int64:}.0, Shape: (1,), ElemSize: 4 Byte(s), TotalSize: 4 Byte(s)\n",
      " - Subtensor{:int64:}.0, Shape: (1,), ElemSize: 4 Byte(s), TotalSize: 4 Byte(s)\n",
      " - Subtensor{:int64:}.0, Shape: (1,), ElemSize: 4 Byte(s), TotalSize: 4 Byte(s)\n",
      " - Subtensor{:int64:}.0, Shape: (1,), ElemSize: 4 Byte(s), TotalSize: 4 Byte(s)\n",
      " - Subtensor{:int64:}.0, Shape: (1,), ElemSize: 4 Byte(s), TotalSize: 4 Byte(s)\n",
      " - Subtensor{:int64:}.0, Shape: (1,), ElemSize: 4 Byte(s), TotalSize: 4 Byte(s)\n",
      " - TensorConstant{(1,) of -1}, Shape: (1,), ElemSize: 4 Byte(s), TotalSize: 4 Byte(s)\n",
      " - <TensorType(bool, vector)>, Shared Input, Shape: (1,), ElemSize: 1 Byte(s), TotalSize: 1 Byte(s)\n",
      " - TensorConstant{(1, 1) of False}, Shape: (1, 1), ElemSize: 1 Byte(s), TotalSize: 1 Byte(s)\n",
      " - Subtensor{:int64:}.0, Shape: (1,), ElemSize: 1 Byte(s), TotalSize: 1 Byte(s)\n",
      " - Subtensor{:int64:}.0, Shape: (1,), ElemSize: 1 Byte(s), TotalSize: 1 Byte(s)\n",
      " - Subtensor{:int64:}.0, Shape: (1,), ElemSize: 1 Byte(s), TotalSize: 1 Byte(s)\n",
      " - TensorConstant{0}, Shape: (), ElemSize: 1 Byte(s), TotalSize: 1.0 Byte(s)\n",
      " - Full block matrix for faults or drift. We take 2 times len points for the faultdrift., Input, Shape: (0, 125002), ElemSize: 8 Byte(s), TotalSize: 0 Byte(s)\n",
      " TotalSize: 18149284.0 Byte(s) 0.017 GB\n",
      " TotalSize inputs: 5148633.0 Byte(s) 0.005 GB\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "geo_model.qi.get('surface_points')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:59.255950Z",
     "start_time": "2020-04-15T10:42:59.240951Z"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "19fb18dabafb48e49fb6b2244757a893",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "QgridWidget(grid_options={'fullWidthRows': True, 'syncColumnCellResize': True, 'forceFitColumns': True, 'defau…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "geo_model.qi.get('surfaces')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:59.266952Z",
     "start_time": "2020-04-15T10:42:59.255950Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "e50e25f1cf124cb2ac3eb81a8314d5bb",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "QgridWidget(grid_options={'fullWidthRows': True, 'syncColumnCellResize': True, 'forceFitColumns': True, 'defau…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "geo_model.qi.get('series')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:59.276950Z",
     "start_time": "2020-04-15T10:42:59.266952Z"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d47a0d468c0d4c64a14d114bb2fb09ad",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "QgridWidget(grid_options={'fullWidthRows': True, 'syncColumnCellResize': True, 'forceFitColumns': True, 'defau…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fault colors changed. If you do not like this behavior, set change_color to False.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "i:\\pycharmprojects\\gempy\\gempy\\core\\solution.py:315: UserWarning: Surfaces not computed due to: No surface found at the given iso value.. The surface is: Series: No surface found at the given iso value.; Surface Number:0\n",
      "  '; Surface Number:' + str(s_n))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fault colors changed. If you do not like this behavior, set change_color to False.\n",
      "Fault colors changed. If you do not like this behavior, set change_color to False.\n"
     ]
    }
   ],
   "source": [
    "geo_model.qi.get('faults')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:59.288949Z",
     "start_time": "2020-04-15T10:42:59.277951Z"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "6b75710f40034a1bac4db8b7e5ca9e7c",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "QgridWidget(grid_options={'fullWidthRows': True, 'syncColumnCellResize': True, 'forceFitColumns': True, 'defau…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "geo_model.qi.get('faults_relations')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>order_series</th>\n",
       "      <th>BottomRelation</th>\n",
       "      <th>isActive</th>\n",
       "      <th>isFault</th>\n",
       "      <th>isFinite</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Default series</th>\n",
       "      <td>1</td>\n",
       "      <td>Erosion</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>series1</th>\n",
       "      <td>2</td>\n",
       "      <td>Fault</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "                order_series BottomRelation  isActive  isFault  isFinite\n",
       "Default series             1        Erosion      True    False     False\n",
       "series1                    2          Fault      True     True     False"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "geo_model.stack"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\n",
       "Lithology ids \n",
       "  [0. 0. 0. ... 0. 0. 0.] "
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gp.compute_model(geo_model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>X</th>\n",
       "      <th>Y</th>\n",
       "      <th>Z</th>\n",
       "      <th>smooth</th>\n",
       "      <th>surface</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>299.600201</td>\n",
       "      <td>772.615765</td>\n",
       "      <td>-552.816467</td>\n",
       "      <td>0.000001</td>\n",
       "      <td>surface1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>582.115016</td>\n",
       "      <td>663.868433</td>\n",
       "      <td>-740.618860</td>\n",
       "      <td>0.000001</td>\n",
       "      <td>surface1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>758.235692</td>\n",
       "      <td>11.568112</td>\n",
       "      <td>-629.601263</td>\n",
       "      <td>0.000001</td>\n",
       "      <td>surface1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>473.917077</td>\n",
       "      <td>79.266347</td>\n",
       "      <td>-337.568765</td>\n",
       "      <td>0.000001</td>\n",
       "      <td>surface1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>77.856401</td>\n",
       "      <td>473.182159</td>\n",
       "      <td>-240.869901</td>\n",
       "      <td>0.000001</td>\n",
       "      <td>surface2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>484.397244</td>\n",
       "      <td>447.213061</td>\n",
       "      <td>-335.870346</td>\n",
       "      <td>0.000001</td>\n",
       "      <td>surface2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "            X           Y           Z    smooth   surface\n",
       "0  299.600201  772.615765 -552.816467  0.000001  surface1\n",
       "1  582.115016  663.868433 -740.618860  0.000001  surface1\n",
       "4  758.235692   11.568112 -629.601263  0.000001  surface1\n",
       "5  473.917077   79.266347 -337.568765  0.000001  surface1\n",
       "3   77.856401  473.182159 -240.869901  0.000001  surface2\n",
       "2  484.397244  447.213061 -335.870346  0.000001  surface2"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "i:\\pycharmprojects\\gempy\\gempy\\core\\solution.py:315: UserWarning: Surfaces not computed due to: No surface found at the given iso value.. The surface is: Series: No surface found at the given iso value.; Surface Number:0\n",
      "  '; Surface Number:' + str(s_n))\n"
     ]
    }
   ],
   "source": [
    "geo_model.surface_points"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Finite Fault parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:59.477949Z",
     "start_time": "2020-04-15T10:42:59.288949Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "../../..\\gempy\\core\\solution.py:284: UserWarning: Attribute error. Using non masked marching cubesmarching_cubes_lewiner() got an unexpected keyword argument 'mask'.\n",
      "  warnings.warn('Attribute error. Using non masked marching cubes' + str(e)+'.')\n"
     ]
    }
   ],
   "source": [
    "geo_model.interpolator.theano_graph.not_l.set_value(1.)\n",
    "vtk_object.update_model()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:59.482949Z",
     "start_time": "2020-04-15T10:42:59.478949Z"
    }
   },
   "outputs": [],
   "source": [
    "geo_model.interpolator.theano_graph.ellipse_factor_exponent.set_value(50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-15T10:42:59.661951Z",
     "start_time": "2020-04-15T10:42:59.483949Z"
    }
   },
   "outputs": [],
   "source": [
    "vtk_object.update_model()"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Tags",
  "hide_input": false,
  "jupytext": {
   "split_at_heading": true
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  },
  "latex_envs": {
   "LaTeX_envs_menu_present": true,
   "autocomplete": true,
   "bibliofile": "biblio.bib",
   "cite_by": "apalike",
   "current_citInitial": 1,
   "eqLabelWithNumbers": true,
   "eqNumInitial": 1,
   "hotkeys": {
    "equation": "Ctrl-E",
    "itemize": "Ctrl-I"
   },
   "labels_anchors": false,
   "latex_user_defs": false,
   "report_style_numbering": false,
   "user_envs_cfg": false
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {
    "height": "11px",
    "width": "251px"
   },
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": "block",
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
